我有一大系列栅格数据集,代表了几十年来的月降雨量。我用Python编写了一个循环遍历每个栅格的脚本并执行以下操作:
脚本只是一个由循环语句包围的数组代数方程式列表。
如果我只是在我的数据的一小部分(比如20年的价值)上运行脚本,那么一切都运行良好,但如果我尝试处理整个数据,我会得到一个MemoryError
。该错误不会提供任何更多的信息(除了它突出显示Python放弃的代码中的行)。
不幸的是,我无法轻松处理我的数据 - 我真的需要能够一次完成所有这些工作。这是因为,在每次迭代结束时,输出(水位)被反馈到下一次迭代中作为起始点。
我对编程的理解目前非常基础,但我认为我的所有对象都会在每个循环中被覆盖。我(愚蠢地?)假设如果代码设法成功循环一次,那么它应该能够无限循环而不会占用越来越多的内存。
我已经尝试过阅读各种文档,并发现了一些名为“垃圾收集器”的东西,但我觉得我已经离开了我的深度,我的大脑正在融化!任何人都能提供一些基本的见解,当我的代码循环时,内存中的对象实际发生了什么?有没有办法在每个循环结束时释放内存,或者是否有更多的“Pythonic”编码方式可以完全避免这个问题?
答案 0 :(得分:5)
您不需要关心内存管理,特别是对于具有您很可能甚至不使用的特定任务的垃圾收集器。 Python将始终收集它可以使用的内存并重用它。
您的问题只有两个原因:您尝试加载的数据太多而无法容纳到内存中,或者您的计算存储数据(列表,字典,迭代之间持久存在的东西)以及存储增长和增长。 Memory profilers can help找到了。
答案 1 :(得分:4)
“强制”垃圾收集器清除临时循环对象的快速方法是del语句:
for obj in list_of_obj:
data = obj.getData()
do_stuff(data)
del data
这会强制解释器删除并释放临时对象。注意:这不能确保程序在计算的其他部分不会泄漏或消耗内存,只需快速检查