2017-06-04 32 views
0

我是新來的python,並開始使用numpy。我遵循紙質算法和我的數據集,它需要一個尺寸爲100萬* 1百萬的數組。Python:使用numpy數組時避免內存錯誤的另一種方法?

確切代碼是larray(np.random.normal(0, sigma**2, size=(794832, 794832))

雖然我有16GB的RAM,numpy的嘗試將數組加載到存儲器中,而創建,因此,我正在memoryerror。我嘗試使用lazyarray延遲初始化,但仍然無法正常工作。

有什麼辦法可以創建一個使用文件系統而不是內存的數組?

在此先感謝。

+1

您需要超過4 TB的RAM。我認爲你沒有足夠的交換空間。 – Daniel

+0

請參閱https://stackoverflow.com/questions/1053928/very-large-matrices-using-python-and-numpy – clockwatcher

+0

你不可能在一個消費者級別的個人電腦上存儲具有萬億元素的數組。即使你使用輔助內存,你也需要一個TB級的硬盤。你真的想用10^6×10^6陣列做什麼?這可能是一個XY問題 – JacaByte

回答

1

您正在創建的數據大小將取決於矩陣大小和數據的精度類型。

您正在嘗試使用np.random.normal創建一個具有float64精度類型值的矩陣。 64位數字表示每個數字使用64位,因此每個數字需要8個字節(每字節8位)的內存。如果您的矩陣的形狀/尺寸爲4000x794832,那意味着您需要〜23.7GB [4000 * 794832 * 8]的內存分配。

如果你有一個16GB的RAM,它應該是不夠的,因爲它會使用SWAP(如果定義的足夠多),可能需要一些時間來創建它,或者只是內存不足。

問題是,你需要一個float64精度?因爲它似乎對通常的科學家發展很重要。因此,爲了加速以下任何數學運算,您可以考慮將矩陣精度類型更改爲float16,例如[4000 * 794832 * 2]。

import numpy as np 
a = np.random.normal(0, 0.7**2, size=(4000,794832)) 
a.nbytes # will give a size of 25434624000 [~23.7GB] (huge number) 
b = np.random.normal(0, 0.7**2, size=(4000,794832)).astype(np.float16) 
b.nbytes # will give a size of 6358656000 [~5.9GB](big but at least you can do everything on RAM) 

在這種情況下的問題是np.random.normal還沒有得到選項定義直接numpy的dtype,所以您將創建一個float64矩陣,然後將其轉換,這並不是一個非常有效的選擇。但如果沒有其他選擇...

相關問題