使用Python将大量数据插入SQLite

使用Python将大量数据插入SQLite,python,sqlite,Python,Sqlite,我读到: 似乎每个人都建议使用逐行读取,而不是从SQLite使用bulk.import。但是,如果有数百万行数据,则插入速度会非常慢。有没有其他方法可以避免这种情况 更新:我尝试了以下代码逐行插入,但速度不如我预期的好。还有什么可以改进的吗 for logFileName in allLogFilesName: logFile = codecs.open(logFileName, 'rb', encoding='utf-8') for logLine in logFile:

我读到:

似乎每个人都建议使用逐行读取,而不是从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()
Sqlite可以做到这一点,只需确保在一个事务中使用BEGIN和COMMIT围绕插入来完成所有操作。(executemany()会自动执行此操作。)


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

使用生成器表达式动态地将数据分成块,在事务中插入数据。以下是一段引自:

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

您的代码可能是什么样子的


另外,sqlite也有这样的能力。

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

从您可以使用的

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可以一次导入多个CSV文件。我找不到这样做的方法?不要认为一次导入多个csv文件是可能的。我认为,将数据分块并插入到事务中应该是一种方法。谢谢!我想我会同意的。导入CSV文件链接无效。谢谢!我现在正在尝试,并将报告速度。我只是尝试了你建议的逐行插入。速度还不错,但仍然没有我希望的那么快。也许我的代码写得不够好。我在上面的问题中更新了它。你有什么建议吗?这是闪电般的快,因为你正在使用sqlite作为内存中的数据库…减少了2分钟的创建任务不到一秒钟!这是一个文件数据库,所以它是lightning无论如何我怎么从中读取?我应该选择什么或在sqlite3中打开什么来检索或读取此数据库中的值。当我打开sqlite3时,架构没有显示此表cli@VIshuKamble这将创建内存中的db,在关闭程序后会丢失。如果要持久化数据,请在程序运行时使用
sqlite3.connect(“path/to/dbFile”)
@jnovacho no。但是谢谢!