shi*_*mao 8 python freeze out-of-memory
我曾经在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 Generators 的方法。由于我想将计算后的数据存储在数据库中,因此当我完成计算后,我会将每一行写入数据库。
def fetch_rows(cursor, arraysize=1000):
while True:
results = cursor.fetchmany(arraysize)
if not results:
break
for result in results:
yield result
Run Code Online (Sandbox Code Playgroud)
通过这种方法,我将使用生成器对生成的结果进行计算:
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)
Run Code Online (Sandbox Code Playgroud)
然而,此过程确实需要您有足够的物理 RAM 来将数据存储在内存中。
我希望这对遇到同样问题的人有所帮助。
| 归档时间: |
|
| 查看次数: |
1521 次 |
| 最近记录: |