在Python列表结构中合理存储超过10亿个值
我正在写一个程序,这个程序可以为一个固定区域的数字高程模型(已经转换成数组)创建多功能图。我的工作是计算点对之间的方差(高度差)和滞后(距离),这些计算是在一定的窗口限制内进行的。每个数组位置都会和其他所有位置进行比较。对于每一对点,我会把滞后和方差的值分别添加到两个不同的列表中。一旦所有的点对都比较完了,这些列表就会被用来进行数据分箱、平均计算,最后绘图。
这个程序在较小的窗口尺寸下运行得很好(比如60x60像素)。对于大约120x120像素的窗口,我能慢慢让程序运行,这样会产生两个列表,每个列表有207,360,000个条目。但如果窗口更大,比如240x240像素,我就会遇到“内存错误”的问题,这样会产生3,317,760,000个条目。
在程序开始时,我创建了一个空列表:
variance = []
lag = []
然后在一个循环中,我计算滞后和方差,并把这些值添加到不同的列表中:
variance.append(var_val)
lag.append(lag_val)
我查看了一些StackOverflow的页面,发现有类似的问题在这里讨论过。这个解决方案可能会提高程序的运行效率,但提供的方案最多只支持1亿个条目,所以对我处理更大区域(比如240x240像素的例子)没有帮助。我也考虑过使用numpy数组来存储这些值,但我觉得这也无法解决内存问题。
如果有任何建议,能让我在处理更大窗口尺寸时使用某种比例列表,我将非常感激。
我刚开始学习Python,所以请多多包涵。
代码的主要部分可以在这里查看。
3 个回答
试试使用heapq,先导入heapq。它使用堆来存储数据,而不是使用栈,这样你就可以访问计算机的全部内存。
使用Python的array
模块。这个模块提供了一些类似列表的类型,它们在内存使用上更高效(但不能像普通列表那样存储各种随机对象)。比如,你可以创建一个只包含普通浮点数的数组(在C语言中叫“双精度”),或者甚至是单精度浮点数(每个占用四个字节,而不是八个字节,但精度会降低)。如果你有一个包含30亿个单精度浮点数的数组,它只需要12GB的内存。