【问题标题】:64 bit python fills up memory until computer freezes with no memerror64位python填满内存,直到计算机冻结而没有memerror
【发布时间】:2014-01-02 17:57:14
【问题描述】:

我曾经在 32 位操作系统上运行 32 位 python,每当我不小心将值附加到无限列表中的数组或尝试加载太大的文件时,python 都会因内存不足错误而停止。但是,我现在在 64 位操作系统上使用 64 位 python,python 没有给出异常,而是用尽了最后一点内存并导致我的计算机死机,所以我不得不重新启动它。

我查看了堆栈溢出,似乎没有控制内存使用或限制内存使用的好方法。例如,这个解决方案:How to set memory limit for thread or process in python? 限制了 python 可以使用的资源,但是粘贴到我想写的每一段代码中是不切实际的。

如何防止这种情况发生?

【问题讨论】:

  • 什么操作系统?你有多少交换空间?
  • @mgilson Windows 8。我不确定交换空间是什么,因为根据谷歌,它似乎适用于 linux。
  • 您可以在 PYTHONSTARTUP 文件中添加节来设置内存限制 - 这将有助于您运行。 stackoverflow.com/a/5837597/148870
  • @Amber 我不太确定启动脚本是什么或如何限制内存使用。我以前从未使用过。谷歌上有一些具体的例子,但没有一个解释如何限制内存。您能否详细说明解决方案?
  • 这里也有同样的问题...

标签: python out-of-memory freeze


【解决方案1】:

我不知道这是否会成为除我之外的其他人的解决方案,因为我的情况非常具体,但我想我会在这里发布它以防有人可以使用我的程序。

我有一个非常庞大的数据集,其中包含数百万行数据。一旦我通过 postgreSQL 数据库查询了这些数据,我就用完了很多可用内存(在使用 Python 3.x 64 位的 Windows 10 64 位 PC 上总共有 63.9 GB 可用),并且对于我使用的每个查询28-40 GB 的内存作为数据行将保存在内存中,而 Python 对数据进行计算。我使用 psycopg2 模块连接到我的 postgreSQL。

我的初始程序是执行计算,然后将结果附加到我将在我的方法中返回的列表中。我很快就在内存中存储了太多东西,我的电脑开始吓坏了(冻结,让我退出 Windows,显示驱动程序停止响应等等)。

因此我改变了使用Python Generators 的方法。由于我想将我进行计算的数据存储在我的数据库中,所以我会在完成计算后将每一行写入我的数据库。

def fetch_rows(cursor, arraysize=1000):
    while True:
        results = cursor.fetchmany(arraysize)
        if not results:
            break
        for result in results:
            yield result

通过这种方法,我将使用生成器对产生的结果进行计算:

def main():
    connection_string = "...."
    connection = psycopg2.connect(connection_string)
    cursor = connection.cursor()

    # Using generator
    for row in fecth_rows(cursor):
        # placeholder functions
        result = do_calculations(row) 
        write_to_db(result)

但是,此过程确实需要您有足够的物理 RAM 来将数据存储在内存中。

我希望这对遇到同样问题的人有所帮助。

【讨论】:

    猜你喜欢
    • 2011-03-03
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 2019-11-16
    相关资源
    最近更新 更多