【问题标题】:How to import big CSV file into Sqlite3 in python?如何在 python 中将大 CSV 文件导入 Sqlite3?
【发布时间】:2017-12-05 08:21:12
【问题描述】:

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

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

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

【问题讨论】:

  • 您可能会受到 IO 限制。一开始只需一次读一行,看看你是怎么理解的。如果花费的时间太长,您可以进行批处理,然后,如果花费的时间太长,请考虑多处理。你可能会发现多处理会减慢它的速度,因为锁会序列化访问。
  • 当您尝试使用 Python csv 模块时发生了什么?
  • 速度不是问题,它可以很慢地运行,从我的SSD读写数据到HDD。它只需要适应有限数量的 RAM。多处理将是一个不错的好处,但在这种情况下不是必需的。
  • 我尝试使用 csv 模块来加载 CSV 文件,它使用了我所有的 RAM。还不知道如何在较小的部分中阅读。
  • for row in csv.reader(file_object): 将一次读取一行。见csv.reader

标签: python csv sqlite


【解决方案1】:

我找到了一个解决方案,我自己挖掘并结合了其他 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)

这当然可以进一步调整以使用多线程,但由于并行插入时数据库中的死锁,我无法做到这一点。但如果你有时间,这是一个可靠的解决方案。

【讨论】:

    猜你喜欢
    • 2020-08-23
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 2011-02-22
    • 2012-06-24
    • 2018-04-03
    • 1970-01-01
    • 2020-01-10
    相关资源
    最近更新 更多