[英]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.