python数组,巨大的内存消耗

时间:2015-12-14 13:51:34

标签: python arrays numpy

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

在我完成整个文件之后,我人工添加我计算每个全局数组和图的元素的平均值。max_size_arr是数组中最长元素的长度(我在竞争时竞争它)我遍历文件中的行

arr = [x+[0]*(max_size_arr - len(x)) for x in arr_of_arr]

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

arr = np.mean(np.array(arr),axis=0)

然而,这会导致巨大的内存消耗(根据群集信息,如100GB)。在减少内存消耗的结构意义上,什么是一个很好的解决方案? numpy数组会比python中的普通数组轻吗?

3 个答案:

答案 0 :(得分:1)

我认为巨大的内存消耗是因为你想要将整个数组同时存储在内存中。

为什么不使用与numpy arrays结合的切片?这样做可以模拟数据的批处理。您可以为函数提供批量大小(1000或10000数组),计算均值并将结果写入dict或文件中,指示切片及其各自的方法。

答案 1 :(得分:0)

您是否尝试过使用Numba套餐?它使用标准的numpy数组减少了计算时间和内存使用量。 http://numba.pydata.org

答案 2 :(得分:0)

如果值的数量变化很大,我会坚持列表,只要实际可行。当数据是' row'时,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]