簡體   English   中英

Python:使用numpy數組時避免memoryerror的另一種方法?

[英]Python: Alternative way to avoid memoryerror when using numpy array?

我是python的新手,開始使用numpy。 我正在按照紙上的算法進行操作,對於我的數據集,它需要一個尺寸為100萬* 100萬的數組。

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

雖然我有一個16GB的內存,但numpy嘗試在創建時將數組加載到內存中,因此,我遇到了memoryerror 我嘗試對lazyarray使用延遲初始化, lazyarray仍然無法正常工作。

有什么方法可以創建使用文件系統而不是ram的數組?

提前致謝。

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

您正在嘗試使用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矩陣,然后將其轉換,這並不是一個非常有效的選擇。 但是如果別無選擇...

暫無
暫無

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

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