use*_*304 20 python csv sqlite
我正在"转换"一个大的(~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))
Run Code Online (Sandbox Code Playgroud)
一切都按照我的预期进行,但例外情况是......它需要花费大量的时间来处理.我编码不正确吗?有没有更好的方法来实现更高的性能并完成我需要的(只需将CSV的几个字段转换为SQLite表)?
**编辑 - 我尝试按照建议直接将csv导入sqlite但事实证明我的文件在字段中有逗号(例如"My title, comma").这导致导入错误.看来手动编辑文件的次数太多了......
还有其他的想法??**
小智 25
可以直接导入CSV:
sqlite> .separator ","
sqlite> .import filecsv.txt mytable
Run Code Online (Sandbox Code Playgroud)
http://www.sqlite.org/cvstrac/wiki?p=ImportingFiles
小智 21
克里斯是对的 - 使用交易; 将数据分成块然后存储它.
" ...除非已经在事务中,否则每个SQL语句都会为它启动一个新事务.这非常昂贵,因为它需要重新打开,写入和关闭每个语句的日志文件.这可以通过包装序列来避免使用BEGIN TRANSACTION;和END 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)
Run Code Online (Sandbox Code Playgroud)
mig*_*var 16
正如人们所说的那样(Chris和Sam),事务确实提高了很多插入性能.
请允许我推荐另一个选项,使用一套Python实用程序来处理CSV,csvkit.
安装:
pip install csvkit
Run Code Online (Sandbox Code Playgroud)
解决你的问题
csvsql --db sqlite:///path/to/file.db --insert --table mytable filecsv.txt
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
34483 次 |
| 最近记录: |