我正在“转换”一个大的 (~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"
)。这会导致导入错误。看来这些事件太多了,无法手动编辑文件……
还有其他想法吗??**
原文由 user735304 发布,翻译遵循 CC BY-SA 4.0 许可协议
Chris 是对的——使用交易;将数据分成块,然后存储它。
“ …除非已经在事务中,否则每个 SQL 语句都会为其启动一个新事务。这非常昂贵,因为它需要为每个语句重新打开、写入和关闭日志文件。这可以通过包装序列来避免带有 BEGIN TRANSACTION; 和 END TRANSACTION; 语句的 SQL 语句。这种加速也适用于不改变数据库的语句。 “ - 来源: http ://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html
“ …还有一个可以用来加速 SQLite 的技巧:事务。每当你必须进行多个数据库写入时,将它们放在一个事务中。而不是每次写查询时都写入(并锁定)文件发出后,写入只会在事务完成时发生一次。 ” - 来源: SQLite 的可扩展性如何?