在Python列表结构中合理存储超过10亿个值

3 投票
3 回答
1500 浏览
提问于 2025-04-18 02:21

我正在写一个程序,这个程序可以为一个固定区域的数字高程模型(已经转换成数组)创建多功能图。我的工作是计算点对之间的方差(高度差)和滞后(距离),这些计算是在一定的窗口限制内进行的。每个数组位置都会和其他所有位置进行比较。对于每一对点,我会把滞后和方差的值分别添加到两个不同的列表中。一旦所有的点对都比较完了,这些列表就会被用来进行数据分箱、平均计算,最后绘图。

这个程序在较小的窗口尺寸下运行得很好(比如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 个回答

0

试试使用heapq,先导入heapq。它使用堆来存储数据,而不是使用栈,这样你就可以访问计算机的全部内存。

0

使用Python的array模块。这个模块提供了一些类似列表的类型,它们在内存使用上更高效(但不能像普通列表那样存储各种随机对象)。比如,你可以创建一个只包含普通浮点数的数组(在C语言中叫“双精度”),或者甚至是单精度浮点数(每个占用四个字节,而不是八个字节,但精度会降低)。如果你有一个包含30亿个单精度浮点数的数组,它只需要12GB的内存。

0

你可以看看 PyTables 这个库,它是对 HDF5 C语言库的封装,可以和 numpy 以及 pandas 一起使用。

简单来说,PyTables 会把你的数据存储在硬盘上,并在需要的时候自动加载到内存中。

另外,如果你想坚持使用纯 Python,你可以用 sqlite3 数据库来存储和处理你的数据。根据 文档,sqlite 数据库的大小限制是 140TB,这对你的数据来说应该是足够的。

撰写回答