python数组,巨大的内存消耗

python数组,巨大的内存消耗,python,arrays,numpy,Python,Arrays,Numpy,我有一个巨大的文件,第一行是字符串,其他行代表整数。列数是可变的,取决于行。 A有一个全局列表,用于保存中间结果arr\u of_arr是浮动列表的列表。_arr的长度约为5000。此数组的每个元素(也是一个数组)的长度为100.000到10.000.000。元素的最大长度可能会有所不同,因此在创建arr_of_arr时无法提前扩展每个元素 在我处理完整个文件后,我人为地添加,计算每个全局数组和绘图元素的平均值。max\u size\u arr是数组中最长元素的长度(我在文件中的行上迭代时与之竞

我有一个巨大的文件,第一行是字符串,其他行代表整数。列数是可变的,取决于行。 A有一个全局列表,用于保存中间结果
arr\u of_arr
是浮动列表的列表。_arr的长度约为5000。此数组的每个元素(也是一个数组)的长度为100.000到10.000.000。元素的最大长度可能会有所不同,因此在创建arr_of_arr时无法提前扩展每个元素

在我处理完整个文件后,我人为地添加,计算每个全局数组和绘图元素的平均值。
max\u size\u arr
是数组中最长元素的长度(我在文件中的行上迭代时与之竞争)

我需要按元素计算数组的平均值。 例如 [1,2,3]、[4,5,6]、[0,2,10]]将导致[5/3,9/3,19/3](阵列中第一个元素的平均值,阵列中第二个元素的平均值等)


但是,这会导致巨大的内存消耗(根据集群信息,大约100GB)。从结构上讲,什么是减少内存消耗的好解决方案?numpy数组会比python中的普通数组轻吗?

我认为巨大的内存消耗是因为您希望同时将整个数组存储在内存中


你为什么不把切片和……结合起来呢?。这样做可以模拟数据的批处理。您可以为函数指定批大小(1000或10000个数组),计算平均值,并将结果写入一个dict或一个文件,指示切片及其各自的平均值。

您是否尝试过使用Numba软件包?它使用标准numpy阵列减少了计算时间和内存使用。

如果行数在值的数量上有很大差异,我会坚持使用列表列表,只要可行<当数据为“行”长度相同时,代码>numpy数组最好

用一个小例子来说明:

In [453]: list_of_lists=[[1,2,3],[4,5,6,7,8,9],[0],[1,2]]

In [454]: list_of_lists
Out[454]: [[1, 2, 3], [4, 5, 6, 7, 8, 9], [0], [1, 2]]

In [455]: [len(x) for x in list_of_lists]
Out[455]: [3, 6, 1, 2]

In [456]: [sum(x) for x in list_of_lists]
Out[456]: [6, 39, 0, 3]

In [458]: [sum(x)/float(len(x)) for x in list_of_lists]
Out[458]: [2.0, 6.5, 0.0, 1.5]
用数组的方法求平均值,我得到了不同的数字——因为所有的0填充。这是故意的吗

In [460]: max_len=6

In [461]: arr=[x+[0]*(max_len-len(x)) for x in list_of_lists]

In [462]: arr
Out[462]: 
[[1, 2, 3, 0, 0, 0],
 [4, 5, 6, 7, 8, 9],
 [0, 0, 0, 0, 0, 0],
 [1, 2, 0, 0, 0, 0]]
你是说沿着柱子

In [463]: np.mean(np.array(arr),axis=0)
Out[463]: array([ 1.5 ,  2.25,  2.25,  1.75,  2.  ,  2.25])
沿行平均

In [476]:     In [463]: np.mean(np.array(arr),axis=1)
Out[476]: array([ 1. ,  6.5,  0. ,  0.5])
列出最大长度的平均值:

In [477]: [sum(x)/float(max_len) for x in list_of_lists]
Out[477]: [1.0, 6.5, 0.0, 0.5]

您需要更改访问元素的方式,将每个数组的第一个元素存储在其自己的数组中,例如[1,4,0]、[2,5,2]等。我觉得,无序访问元素会破坏您的内存另一种解决方案是使用屈服,().
arr\u of\u arr
应该是一个列表。将其设置为对象类型数组只会使事情变得复杂。你所说的
普通数组是什么意思?
Python有列表。@scrineym我不会无序访问元素。我在集群中只能使用100GB,而我的代码与数组的数组\u的关系超过了这个值。我需要按列计算平均值,因此,rea首先计算所有行(有些行我需要扩展额外的列,因为行可以有不同的列数),然后我计算平均值。计算前1000行的平均值,然后再计算下1000行的平均值对我来说不合适。但是你也可以切片。
In [476]:     In [463]: np.mean(np.array(arr),axis=1)
Out[476]: array([ 1. ,  6.5,  0. ,  0.5])
In [477]: [sum(x)/float(max_len) for x in list_of_lists]
Out[477]: [1.0, 6.5, 0.0, 0.5]