[使用Python批量将大量数据插入SQLite

问题描述 投票:20回答:3

我读此:Importing a CSV file into a sqlite3 database table using Python

并且似乎每个人都建议使用逐行读取,而不是使用SQLite的bulk .import。但是,如果您有数百万行的数据,这将使插入速度非常慢。还有其他方法可以规避吗?

更新:我尝试下面的代码逐行插入,但是速度不如我预期的那样。无论如何,有待改进]

for logFileName in allLogFilesName:
    logFile = codecs.open(logFileName, 'rb', encoding='utf-8')
    for logLine in logFile:
        logLineAsList = logLine.split('\t')
        output.execute('''INSERT INTO log VALUES(?, ?, ?, ?)''', logLineAsList)
    logFile.close()
connection.commit()
connection.close()
python sqlite
3个回答
20
投票

使用生成器表达式将您的数据即时划分为多个块,在事务内进行插入。这是来自sqlite optimization FAQ的报价:

除非已在事务中,否则每个SQL语句都有一个新交易开始了。这非常昂贵,因为它需要重新打开,写入和关闭每个日记文件声明。通过包装SQL语句序列可以避免这种情况与BEGIN TRANSACTION;和结束交易;陈述。加速对于不更改数据库的语句也可得到。

Here's您的代码可能是什么样。

而且,sqlite具有import CSV files的功能。


34
投票

因为这是Google搜索的最佳结果,所以我认为最好更新此问题。

python sqlite docs开始使用

import sqlite3

persons = [
    ("Hugo", "Boss"),
    ("Calvin", "Klein")
]

con = sqlite3.connect(":memory:")

# Create the table
con.execute("create table person(firstname, lastname)")

# Fill the table
con.executemany("insert into person(firstname, lastname) values (?,?)", persons)

我已经使用此方法一次提交了超过50k行插入,并且闪电般快。


15
投票

Sqlite可以执行tens of thousands of inserts per second,只需通过用BEGIN和COMMIT包围插入即可确保在单个事务中完成所有操作。 (executemany()自动执行此操作。)

和往常一样,在您知道速度会成为问题之前,请不要进行优化。首先测试最简单的解决方案,然后仅在速度不可接受时才进行优化。

© www.soinside.com 2019 - 2024. All rights reserved.