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

时间:2013-08-13 21:46:14

标签: python sqlite

我读到了这个:Importing a CSV file into a sqlite3 database table using Python

似乎所有人都建议使用逐行阅读而不是使用SQLite的批量.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()

3 个答案:

答案 0 :(得分:32)

由于这是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的行插入,而且速度很快。

答案 1 :(得分:18)

使用生成器表达式动态地将数据划分为块,在事务中进行插入。以下是sqlite optimization FAQ的引用:

  

除非已经在事务中,否则每个SQL语句都有一个新的   交易开始了。这是非常昂贵的,因为它需要   重新打开,写入和关闭每个日志文件   声明。这可以通过包装SQL语句序列来避免   与BEGIN TRANSACTION;和END TRANSACTION;声明。这种加速   也可以获取不会改变数据库的语句。

Here's代码的外观如何。

此外,sqlite具有import CSV files的能力。

答案 2 :(得分:15)

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

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