【发布时间】: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