10亿+的合理存储;python列表类型结构中的值

10亿+的合理存储;python列表类型结构中的值,python,list,memory,Python,List,Memory,我正在编写一个程序,为已转换为阵列的数字高程模型的固定区域创建vario函数图。我计算窗约束内点对之间的方差(高程差)和滞后(距离)。将每个阵列位置与其他阵列位置进行比较。对于每一对,滞后值和方差值都附加到单独的列表中。一旦对所有数据对进行了比较,这些列表将用于数据装箱、平均和最终绘图 对于较小的窗口大小(例如60x60像素),该程序运行良好。对于高达120x120px左右的windows,它将给出两个包含2073600个条目的列表,我能够慢慢地让程序运行。如果大于此值,我会遇到“MemoryE

我正在编写一个程序,为已转换为阵列的数字高程模型的固定区域创建vario函数图。我计算窗约束内点对之间的方差(高程差)和滞后(距离)。将每个阵列位置与其他阵列位置进行比较。对于每一对,滞后值和方差值都附加到单独的列表中。一旦对所有数据对进行了比较,这些列表将用于数据装箱、平均和最终绘图

对于较小的窗口大小(例如60x60像素),该程序运行良好。对于高达120x120px左右的windows,它将给出两个包含2073600个条目的列表,我能够慢慢地让程序运行。如果大于此值,我会遇到“MemoryError”报告-例如,对于240x240 px区域,我将有3317760000个条目

在程序开始时,我创建了一个空列表:

variance = []
lag =  []
然后在计算滞后和方差的for循环中,我将这些值附加到不同的列表中:

variance.append(var_val)
lag.append(lag_val)
我查看了stackoverflow页面,看到了一个类似的讨论问题。此解决方案可能会提高临时程序的性能,但提供的解决方案最多只能提供1亿个条目,因此无法帮助我解决较大区域的问题(如240x240px示例)。我也考虑过使用numpy数组来存储值,但我认为这不会避免内存问题

对于如何使用我为更大的窗户尺寸定义的某种比例列表的任何建议,我们将不胜感激

我是python新手,请原谅我的无知


代码的主要部分可以看到

使用Python的
数组
模块。它提供了一些类似列表的类型,这些类型的内存效率更高(但与常规列表不同,不能用于存储随机对象)。例如,您可以使用包含常规浮点(C术语中的“double”)的数组,甚至可以使用单精度浮点(每四个字节而不是八个字节,以降低精度为代价)。一个30亿个这样的单浮点数组可以容纳12GB的内存。

您可以查看一个包含C库的库,它可以与numpy和

实际上,PyTables将把数据存储在磁盘上,并根据需要透明地加载到内存中


或者,如果你想坚持使用纯python,你可以使用sqlite3数据库来存储和操作你的数据——比如说sqlite数据库的大小限制是140TB,这对于你的数据来说应该足够了。

不要在意内存需求;随着比较的指数增长,对于较大的数据集,您的算法听起来似乎永远不会结束。您应该使用numpy数组而不是列表(虽然不会解决您的问题,但会更快)。其余的克里格代码是什么样子的?我猜想你也会在那里遇到问题。“马蒂恩皮特斯:二次,但不是指数式的:”——我认为你应该考虑改变你的方法。与其计算一系列方差和滞后,然后计算诸如箱子等汇总统计数据,不如在进行过程中计算这些汇总统计数据。这样,您的最大内存需求将是运行摘要统计数据的大小。@TooTone一种新的方法正是我所需要的-除了摘要统计数据之外,我的代码中不再有任何列表-这些确实是在我继续时计算的。为了减少运行时间,我选择了随机采样策略,而不是将窗口中的所有像素相互比较。