如何在python中编写大型文件而不使内存过载?

如何在python中编写大型文件而不使内存过载?,python,mysql,python-3.x,file-io,Python,Mysql,Python 3.x,File Io,我试图从一个非常大的mysql查询中获取结果,并用Python将其写入一个文件,但我一直遇到内存过载错误。我很容易就提升到60+GB的ram利用率,直到内存耗尽,它崩溃。我如何有效地做到这一点 以下是我的代码片段: with connection.cursor() as cursor: cursor.execute(my_query) row = cursor.fetchone() while row is not None: with open(my_f

我试图从一个非常大的mysql查询中获取结果,并用Python将其写入一个文件,但我一直遇到内存过载错误。我很容易就提升到60+GB的ram利用率,直到内存耗尽,它崩溃。我如何有效地做到这一点

以下是我的代码片段:

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()


非常感谢你

好吧,@Willyzekid为我指出了正确的方向,我找到了答案。除了光标内存问题之外,我还通过这篇文章解决了这个问题:

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


谢谢

好吧,@Willyzekid为我指出了正确的方向,我找到了答案。除了光标内存问题之外,我还通过这篇文章解决了这个问题:

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


谢谢

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