簡體   English   中英

python數組,巨大的內存消耗

[英]python arrays, huge memory consumption

我有一個巨大的文件,第一行作為字符串,其他行表示整數。 列數是可變的,取決於行。 有一個全局列表,我保存我的中間結果。 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中的普通數組更輕嗎?

我認為巨大的內存消耗是因為你想要將整個數組同時存儲在內存中。

為什么不使用與numpy數組相結合的切片? 這樣做可以模擬數據的批處理。 您可以向函數提供批量大小(1000或10000個數組),計算均值並將結果寫入dict或文件,指示切片及其各自的方法。

你嘗試過使用Numba包嗎? 它使用標准的numpy數組減少了計算時間和內存使用量。 http://numba.pydata.org

如果值的數量變化很大,我會堅持列表,只要實際可行。 當數據的'行'長度相同時, 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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM