python数组,巨大的内存消耗
我有一个巨大的文件,第一行是字符串,其他行代表整数。列数是可变的,取决于行。 A有一个全局列表,用于保存中间结果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是数组中最长元素的长度(我在文件中的行上迭代时与之竞
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]