繁体   English   中英

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

[英]Bulk insert huge data into SQLite using Python

我读到了这个: 使用 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()

由于这是谷歌搜索的最高结果,我认为更新这个问题可能会很好。

从你可以使用的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 行插入,而且速度非常快。

使用生成器表达式将数据动态分成块,在事务中插入。 这是sqlite优化常见问题的引用:

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

这里是你的代码可能看起来怎么样。

此外,sqlite 能够导入 CSV 文件

Sqlite每秒可以执行数万次插入,只需确保在单个事务中通过 BEGIN 和 COMMIT 围绕插入来完成所有这些操作。 (executemany() 会自动执行此操作。)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM