我試圖繪製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。對於小光柵來說非常簡單,但是我沒有用完整的光柵製作這個圖。
我希望這個問題很清楚。提前致謝。
爲什麼who; e文件需要在內存中?不能把文件分成塊嗎? – DrBwts
你碰巧知道文件中的值的下限和上限? (例如,「除-9999之外,所有值都在-1000和1000之間」。) –