如何在python中将大型CSV文件导入Sqlite3?
我需要将一个非常大的CSV文件加载到sqlite3中的表中。我不能将整个CSV内容作为一个变量加载到RAM中,因为数据太大,每个列定义类型的事件都无法放入64 GB的RAM中 我曾尝试使用numpy和pandas来加载和转换数据,但仍然远远超出RAM限制 我希望以某种方式一次读取CSV 1行(或以较小的批处理),并逐步将它们保存到数据库中,以保持较低的RAM使用率。如果可以使用多个CPU核心来完成,这将是完美的。如何在python中将大型CSV文件导入Sqlite3?,python,csv,sqlite,Python,Csv,Sqlite,我需要将一个非常大的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(文件对象)中的行:
将一次读取一行。看见