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

Sha*_*har 18 python sqlite

我读到了这一点:使用Python将CSV文件导入sqlite3数据库表

并且似乎每个人都建议使用逐行阅读而不是使用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()
Run Code Online (Sandbox Code Playgroud)

小智 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)
Run Code Online (Sandbox Code Playgroud)

我已经使用这种方法一次提交超过50k的行插入,而且速度很快.

  • 它也很闪电,因为你使用sqlite作为内存数据库...... (4认同)
  • 将 2 分钟的创建任务减少到不到一秒!它是一个文件数据库,所以无论如何它都是闪电 (2认同)

ale*_*cxe 18

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

除非已在事务中,否则每个SQL语句都会为其启动一个新事务.这非常昂贵,因为它需要为每个语句重新打开,写入和关闭日志文件.通过使用BEGIN TRANSACTION包装SQL语句序列可以避免这种情况.和END TRANSACTION; 声明.对于不改变数据库的语句,也可以获得此加速.

以下是您的代码的外观.

此外,sqlite还能够导入CSV文件.


dav*_*fg4 15

Sqlite 每秒可以执行数万次插入,只需确保通过使用BEGIN和COMMIT包围插入来在单个事务中执行所有插入操作.(executemany()自动执行此操作.)

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