Python 读取数据块使用事务在Sqlite中插入数据块

Python 读取数据块使用事务在Sqlite中插入数据块,python,csv,sqlite,transactions,Python,Csv,Sqlite,Transactions,我的问题涉及到这篇关于使用事务以块的形式导入Sqlite中的数据集的老文章: 虽然csv.reader读取内存中的整个文件,然后通过调用函数chunks将文件切碎,但我正在寻找一种解决方案,它将文件分块读取(比如说,10k行),然后将每个块插入Sqlite表,如上所述,直到插入整个文件。如何修改上述内容 list(reader)将遍历整个CSV文件,并将结果存储在列表中。您不想这样做,因为CSV文件很大 另外,您不想运行cur.execute(“开始事务;”;sqlite3模块为您完成了这一任务

我的问题涉及到这篇关于使用事务以块的形式导入Sqlite中的数据集的老文章:

虽然csv.reader读取内存中的整个文件,然后通过调用函数chunks将文件切碎,但我正在寻找一种解决方案,它将文件分块读取(比如说,10k行),然后将每个块插入Sqlite表,如上所述,直到插入整个文件。如何修改上述内容

list(reader)
将遍历整个CSV文件,并将结果存储在列表中。您不想这样做,因为CSV文件很大

另外,您不想运行
cur.execute(“开始事务;”
;sqlite3模块为您完成了这一任务

在循环浏览CSV阅读器时保留一个计数器。检查计数器并使用它偶尔提交

for counter, row in enumerate(reader):
    if counter % CHUNK_SIZE == 0:
        cur.commit()
    cur.execute("INSERT INTO ...")

cur.commit()

(注意:我认为这样分块处理事务不是一个好主意。可能会有帮助,但您必须首先对其进行分析。)

为什么需要分块编写?您还知道吗?是的,我知道Sqlite可以导入csv文件。在我的例子中,我有一个非常庞大的数据集(>10GB),Sqlite只能以块的形式处理它。上面的代码适合我的情况,只要我知道一种不让Python读取内存中整个文件的方法。
list(reader)
将整个内容读取到一个列表中。不要那样做。相反,在enumerate(reader)中迭代i的
行,如果
i==chunksize
提交并打开一个新事务。每次迭代时,我都无法将块插入创建的表中:。。。chunksize=1024,open(“C:/…”,“rt”)作为f:for i,枚举(f)中的行:if i==chunksize:cur.execute('BEGIN TRANSACTION')#如何将块插入表中?几个问题:1。你能不能先解释一下这段代码的注释和分析的内容?;2.上面的代码需要多长时间才能在11GB的文件上完全运行(4个4秒后,我不得不杀死它)?
divdata = chunks(list(reader))
for counter, row in enumerate(reader):
    if counter % CHUNK_SIZE == 0:
        cur.commit()
    cur.execute("INSERT INTO ...")

cur.commit()