2017-05-26 91 views
0

我試圖繪製380Gb二進制柵格數據的經驗累積分佈函數(CDF)。只使用數據的一個小掩碼,下面的代碼完美地工作。Python-讀取非常大的柵格和繪圖經驗累積分佈函數,內存錯誤

import numpy as np 
import matplotlib.pyplot as plt 
dem_name = open('./raster.dem','rb') 
vals = np.fromfile(dem_name,dtype='float32') 
vals = np.negative(vals[vals!=-9999]) 
vals = np.sort(vals) 
y = np.arange(1.,len(vals)+1.)/len(vals) 
plt.plot(vals,y) 

然而,當我嘗試使用此代碼加載整個光柵,它顯然給出了一個內存錯誤。我的電腦有9Tb的磁盤空間,但只限於16Gb的RAM,所以我用numpy.memmap將柵格值轉換爲數組。

dem_name = open('./raster.dem','rb') 
vals = np.memmap(dem_name,dtype='float32','r') 

這工作,但我需要從光柵修剪無數據值(-9999),切換值的符號(負值變爲正)和值從低到高排序。

vals_real = np.memmap(np.sort(np.negative(vals[vals!=-9999]))) 

這將運行幾個小時,然後給出了一個內存錯誤

Y數組,

y = np.arange(1.,len(vals)+1.)/len(vals) 

也太大而被存儲在RAM(給出了存儲器錯誤),但我不能找出如何存儲陣列作爲MEMMAP對象。

這是正確的,爲了繪圖也需要內存,這樣我將需要足夠的磁盤空間2X的光柵文件的大小(2x 380Gb)?所以總結一下,我需要將巨大的柵格讀入python並繪製CDF。對於小光柵來說非常簡單,但是我沒有用完整的光柵製作這個圖。

我希望這個問題很清楚。提前致謝。

+0

爲什麼who; e文件需要在內存中?不能把文件分成塊嗎? – DrBwts

+0

你碰巧知道文件中的值的下限和上限? (例如,「除-9999之外,所有值都在-1000和1000之間」。) –

回答

0

使用380Gb單精度浮標,您有大約950億個值。 請勿嘗試使用全部950億個值繪製ECDF。大多數繪圖軟件不能處理這麼多點,即使可能,大多數顯示器的寬度也只有幾千像素,因此繪製數據的分辨率遠遠高於此點。

取而代之,計算直方圖,並分批工作。如果您已經知道文件中值的合理上限和下限,則可以預先分配直方圖塊。否則,您可能需要一個直方圖算法,以適應每批中到達的新數據。