【问题标题】:Step through CSV file incrementally in Python在 Python 中逐步遍历 CSV 文件
【发布时间】:2019-09-24 05:15:58
【问题描述】:

我正在尝试加快将大型 CSV 文件加载到 MySQL 数据库中的速度。使用此代码加载 4GB 文件大约需要 4 小时:

with open(source) as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    next(csv_reader)
    insert_sql = """ INSERT INTO billing_info_test (InvoiceId, PayerAccountId, LinkedAccountId) VALUES (%s, %s, %s) """
    for row in csv_reader:
        cursor.execute(insert_sql,row)
        print(cursor.rowcount, 'inserted with LinkedAccountId', row[2], 'at', datetime.now().isoformat())
    print("Committing the DB")
    mydb.commit(
cursor.close()
mydb.close()

我想使用executemany() 语句来加快速度。为此,您必须将元组列表传递给第二个参数。

如果我在每次行迭代时构建列表,它会变得太大,并且当列表变得太大时会出现内存不足错误,并且脚本会崩溃。

我无法获取 csv_reader 或 csv_file 的长度以在范围语句中使用。

如何一次遍历 CSV 文件 1000 行并将结果存储在列表中,在 executemany 中使用它,然后存储接下来的 1000 行等,直到 CSV 文件结束?

【问题讨论】:

    标签: python mysql executemany


    【解决方案1】:

    如果你需要在mysql中进行高速插入,可以尝试使用:

    LOAD DATA LOCAL INFILE '/path/to/my_file.csv' INTO TABLE my_table;

    【讨论】:

    • 那里也没有运气。我尝试将 local-infile=1 放在 my.ini 中。然后我重新启动了服务。现在我收到此错误:ERROR 1148 (42000): The used command is not allowed with this MySQL version 我尝试将其放在 [mysql] 和 [mysqld] 部分下并每次都重新启动服务。
    • 我觉得这篇文章应该对你有点帮助:stackoverflow.com/questions/18437689/…
    • 谢谢!那确实有帮助。我现在正在加载文件。但是,我仍然需要学习如何以编程方式处理这个问题。希望我能弄清楚!
    • 那是超级快!我在大约 10 分钟内完成了。但是,当我进行选择时,所有行都是 NULL。所以这并不完全奏效。 ://
    • 是的。它应该是这么快。尝试检查您的所有列(mysql)是否与您的 .csv 文件的列匹配。
    【解决方案2】:

    一个小提示:

    In [1]: import itertools
    
    In [2]: rows = iter(range(10))
    
    In [3]: while True:
       ...:     batch = [*itertools.islice(rows, 3)]
       ...:     if not batch:
       ...:         break
       ...:     print(batch)
       ...:
    [0, 1, 2]
    [3, 4, 5]
    [6, 7, 8]
    [9]
    

    但我应该同意@heliosk 的观点,更好的解决方案是将LOAD DATA INFILE 用于大文件。在导入完成之前,您可能还需要disable keys

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-23
      • 1970-01-01
      • 2019-12-13
      • 1970-01-01
      • 1970-01-01
      • 2012-06-11
      相关资源
      最近更新 更多