我曾经在32位操作系统上运行32位python,每当我意外地将值附加到无限列表中的数组或试图加载太大的文件时,python就会因内存不足而停止。然而,我现在在64位操作系统上使用64位python,python没有给出异常,而是耗尽了最后一位内存,导致我的计算机冻结,因此我不得不重新启动它。
我环顾堆栈溢出,似乎没有一个好的方法来控制内存使用或限制内存使用。例如,这个解决方案:如何在python中设置线程或进程的内存限制?限制了python可以使用的资源,但将其粘贴到我想要编写的每一段代码中是不切实际的。
我该如何防止这种情况发生?
我不知道这是否是除我之外的其他人的解决方案,因为我的案例非常具体,但我想我会把它发布在这里,以防有人使用我的程序。
我有一个非常庞大的数据集,有数百万行的数据。当我通过postgreSQL数据库查询这些数据时,我用完了很多可用内存(在使用Python 3.x 64位的Windows 10 64位PC上,总共有63,9 GB可用内存),每次查询我都使用了大约28-40 GB的内存,因为数据行将保存在内存中,而Python对数据进行计算。我使用psycopg2模块连接到我的postgreSQL。
我最初的过程是执行计算,然后将结果附加到一个列表中,我将在方法中返回该列表。我很快就把太多的内存存储在内存中,我的电脑开始死机(冻结、注销Windows、显示驱动程序停止响应等)。
因此,我改变了使用Python生成器的方法。当我想把我计算的数据存储在数据库中时,我会把每一行都写进数据库,就像我对它进行计算一样。
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来将数据存储在内存中。
我希望这能帮助任何有同样问题的人。