我正在“转换”一个大的(~1.6GB)CSV 文件并将CSV 的特定字段插入到SQLite 数据库中。基本上我的代码如下所示:
import csv, sqlite3
conn = sqlite3.connect( "path/to/file.db" )
conn.text_factory = str #bugger 8-bit bytestrings
cur = conn.cur()
cur.execute('CREATE TABLE IF NOT EXISTS mytable (field2 VARCHAR, field4 VARCHAR)')
reader = csv.reader(open(filecsv.txt, "rb"))
for field1, field2, field3, field4, field5 in reader:
cur.execute('INSERT OR IGNORE INTO mytable (field2, field4) VALUES (?,?)', (field2, field4))
一切都按照我的预期进行,除了......它需要大量的时间来处理。我编码错误吗?有没有更好的方法来实现更高的性能并完成我所需要的(只需将 CSV 的一些字段转换为 SQLite 表)?
**编辑 - 我尝试按照建议将 csv 直接导入 sqlite,但事实证明我的文件在字段中有逗号(例如"My title, comma"
)。这会在导入时产生错误。看来此类事件太多,无法手动编辑文件......
还有其他想法吗??**
Chris是正确使用交易;将数据分成块然后存储。
"...除非已经在事务中,否则每个 SQL 语句都会为其启动一个新事务。这是非常昂贵的,因为它需要重新打开、写入和关闭每个语句的日志文件。这可以通过用 BEGIN TRANSACTION 包装 SQL 语句序列来避免;和结束交易;声明。对于不改变数据库的语句也可以获得这种加速。“ - 来源:http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html
"...还有另一个技巧可以用来加速 SQLite:事务。每当您必须执行多个数据库写入操作时,请将它们放入事务中。与每次发出写入查询时写入(并锁定)文件不同,写入只会在事务完成时发生一次。“ - 来源:SQLite 的可扩展性如何?
import csv, sqlite3, time
def chunks(data, rows=10000):
""" Divides the data into 10000 rows each """
for i in xrange(0, len(data), rows):
yield data[i:i+rows]
if __name__ == "__main__":
t = time.time()
conn = sqlite3.connect( "path/to/file.db" )
conn.text_factory = str #bugger 8-bit bytestrings
cur = conn.cur()
cur.execute('CREATE TABLE IF NOT EXISTS mytable (field2 VARCHAR, field4 VARCHAR)')
csvData = csv.reader(open(filecsv.txt, "rb"))
divData = chunks(csvData) # divide into 10000 rows each
for chunk in divData:
cur.execute('BEGIN TRANSACTION')
for field1, field2, field3, field4, field5 in chunk:
cur.execute('INSERT OR IGNORE INTO mytable (field2, field4) VALUES (?,?)', (field2, field4))
cur.execute('COMMIT')
print "\n Time Taken: %.3f sec" % (time.time()-t)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)