2012-06-28 27 views
7

我正在使用numpy創建一個邊長度爲100的立方體數組,因此總共包含100萬個條目。對於每百萬個條目,我插入一個100x100矩陣,其條目由隨機生成的數字組成。我使用下面的代碼可以這樣做:numpy數組有多少內存? RAM是限制因素嗎?

import random 
from numpy import * 

cube = arange(1000000).reshape(100,100,100) 

for element in cube.flat: 
    matrix = arange(10000).reshape(100,100) 
    for entry in matrix.flat: 
     entry = random.random()*100 
    element = matrix 

我期待這需要一段時間,但與正在生成10張十億的隨機數,我不知道我的電腦甚至可以處理它。這樣一個數組佔用多少內存? RAM是否會成爲一個限制因素,即如果我的計算機沒有足夠的RAM,它是否可能無法真正生成陣列?

另外,如果有一個更有效的實現這個代碼,我將不勝感激提示:)

+4

假設'double'精度,在8個字節的每個,如果你真的試圖存儲100億,這是80GB。如果你不得不問,你的電腦沒有足夠的內存。也就是說,它看起來像你正在創建它們,但沒有存儲它們,所以你應該沒問題。 – Gabe

回答

17

有幾點:

  • 大小在numpy的數組的內存很容易計算。它只是元素數量乘以數據大小,加上一個小的常量開銷。例如,如果您的cube.dtypeint64,並且它有1,000,000個元素,則需要1000000 * 64/8 = 8,000,000字節(8Mb)。
  • 但是,正如@Gabe所說的,100 * 100 * 1,000,000雙打將需要大約80 Gb
  • 這不會導致任何事情「中斷」,但是由於您的計算機需要完成所有swapping操作,因此操作會非常慢。
  • 你的循環不會做你期望的。而不是替換cube中的元素,element = matrix將簡單地覆蓋element變量,使cube保持不變。 entry = random.rand() * 100也是如此。
  • 相反,看到:http://docs.scipy.org/doc/numpy/reference/arrays.nditer.html#modifying-array-values
+1

如果你超過了可用虛擬內存的總量,那麼事情確實會「破裂」,這很可能是因爲沒有多少人具有> 80GB的交換空間 –

+0

在處理諸如np之類的函數時,情況並非完全如此.zeros()'。使用延遲加載(至少在Linux版本中),這將避免在訪問某些元素之前使用大量內存。例如,你可以用'np.zeros((24000,24000))'做一個矩陣,它不佔用太多的內存,但是如果你使用'np.random.random((24000,24000))'它佔用了4 GB多一點。 更好的解釋:https://stackoverflow.com/questions/27574881/why-does-numpy-zeros-takes-up-little-space –

2

您的功能的 「內部」 部分,看看numpy.random模塊

import numpy as np 
matrix = np.random.random((100,100))*100