Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中将大型CSV文件导入Sqlite3?_Python_Csv_Sqlite - Fatal编程技术网

如何在python中将大型CSV文件导入Sqlite3?

如何在python中将大型CSV文件导入Sqlite3?,python,csv,sqlite,Python,Csv,Sqlite,我需要将一个非常大的CSV文件加载到sqlite3中的表中。我不能将整个CSV内容作为一个变量加载到RAM中,因为数据太大,每个列定义类型的事件都无法放入64 GB的RAM中 我曾尝试使用numpy和pandas来加载和转换数据,但仍然远远超出RAM限制 我希望以某种方式一次读取CSV 1行(或以较小的批处理),并逐步将它们保存到数据库中,以保持较低的RAM使用率。如果可以使用多个CPU核心来完成,这将是完美的。 我找到了一个解决方案,通过挖掘自己,结合其他堆栈溢出问题的答案。代码应该是这样

我需要将一个非常大的CSV文件加载到sqlite3中的表中。我不能将整个CSV内容作为一个变量加载到RAM中,因为数据太大,每个列定义类型的事件都无法放入64 GB的RAM中

我曾尝试使用numpy和pandas来加载和转换数据,但仍然远远超出RAM限制

我希望以某种方式一次读取CSV 1行(或以较小的批处理),并逐步将它们保存到数据库中,以保持较低的RAM使用率。如果可以使用多个CPU核心来完成,这将是完美的。

我找到了一个解决方案,通过挖掘自己,结合其他堆栈溢出问题的答案。代码应该是这样的:

import sqlite3
import pandas as pd

def add_to_db(row, con):
    # Function that make insert to your DB, make your own.

def process_chunk(chunk):
    # Handles one chunk of rows from pandas reader.
    con = sqlite3.connect("favorita.db")
    for row in chunk:
        add_to_db(row, con)
    con.commit()

for chunk in pd.read_csv('data.csv', chunksize=100000):
    # Adjust chunksize to your needs and RAM size.
    process_chunk(chunk.values)

这当然可以进一步调整为使用多线程,但我无法做到这一点,因为在并行执行插入时,数据库中存在死锁。但如果你有时间,这是一个固溶体。

你可能会被IO束缚。刚开始一行一行读,看看你进展如何。如果需要的时间太长,您可以进行批处理,只有这样,如果需要的时间太长,才可以考虑多处理。您可能会发现多处理EVEN会减慢速度,因为锁将串行访问。当您尝试使用Python
csv
模块时发生了什么?速度不是问题,它可以运行缓慢,从SSD向HDD读取和写入数据。它只需要安装在有限数量的RAM中。多处理将是一个不错的奖励,但在这种情况下它不是必需的。我尝试使用csv模块加载csv文件,它使用了我所有的RAM。还不知道如何读取较小的部分。
对于csv.reader(文件对象)中的行:
将一次读取一行。看见