我有一个非常大的CSV文件,我需要加载到sqlite3中的表中。我无法将整个CSV内容作为变量加载到RAM中,因为数据非常大,该事件定义了每列不能容纳64 GB RAM的类型。
我曾尝试使用numpy和pandas来加载和转换数据,但仍然超过了RAM限制。
我想以某种方式一次读取CSV 1行(或以较小的批次)并逐步将它们保存到数据库中以保持低RAM使用率。如果可以使用多个CPU核心完成,那将是完美的。
答案 0 :(得分:2)
我找到了一个解决方案,并结合其他Stack Overflow问题的答案。代码应该是这样的:
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)
这肯定可以进一步调整为使用多线程,但由于数据库中并行执行插入时死机,我无法做到这一点。但如果你有时间,这是一个可靠的解决方案。