【问题标题】:How to write large files in python without overloading memory?如何在python中写入大文件而不会使内存过载?
【发布时间】:2020-05-19 22:32:17
【问题描述】:

我正在尝试从一个非常大的 mysql 查询中获取结果并将它们写入 Python 中的文件,但我一直遇到内存过载错误。我已经轻松地爬升到了 60+ GB 的内存利用率,直到我用完内存并且它崩溃了。我如何有效地做到这一点?

这是我的代码 sn-p:

with connection.cursor() as cursor:
    cursor.execute(my_query)
    row = cursor.fetchone()
    while row is not None:
        with open(my_file,'a+') as f:
            f.writelines(row)
        row = cursor.fetchone()

这仍然会使我的记忆超负荷,即使我原以为它一次只有一行。

我也尝试过在每一行使用 f.flush(),以及重新打开文件,然后在每一行运行 f.close()。

非常感谢!!

【问题讨论】:

  • 可能更多的是其他地方的内存泄漏 - 您是否尝试过不时关闭光标?
  • 感谢您的帮助!你知道如何关闭光标而不丢失查询结果吗?
  • 您可以使用您拥有的索引(按日期等)对查询进行分区,或者可以在服务器端使用游标。但是你使用的是什么 mysql 连接器?必须有办法避免这种情况,并利用查询/游标设置中的一些选项(并使用文档来验证我对游标内存问题的假设)
  • 为什么每次要追加文件时都打开文件? open 语句不应该在循环之外吗?
  • 我将 open 语句放在循环中,以免将写入文件的所有内容加载到内存中,因此这个问题与内存过载有关。是的,如果我没有遇到最有意义的内存问题,但写入文件的内容太大。

标签: python mysql python-3.x file-io


【解决方案1】:

好的,@Willyzekid 为我指出了正确的方向,我想通了。除了存在光标内存问题,我使用这篇文章发现了这个问题:MySQLdb - cursor - memory leak?

我也没有意识到,在我的代码 sn-p 上面,我已经从一个查询中获取了输出,并将其用作 sn-p 中该查询的输入。我将第一个查询的输出加载到内存中,这也使其超载。 @Willyzekid 强调了同样的问题,只是在代码中的不同位置。

谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 2018-10-17
    • 2010-10-15
    • 2014-12-19
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    相关资源
    最近更新 更多