2012-06-28 7 views
7

Używam numpy do utworzenia tablicy kostki o bokach o długości 100, zawierającej łącznie 1 milion wpisów. Dla każdego z milionów wpisów wstawiam macierz 100x100, której wpisy składają się z losowo generowanych liczb. Używam następujący kod, aby to zrobić:Ile pamięci w tablicy numpy? Czy pamięć RAM jest czynnikiem ograniczającym?

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 

Spodziewałem się to trochę potrwać, ale jest generowany 10 miliardów liczb losowych, nie jestem pewien, że mój komputer może nawet poradzić. Ile pamięci zajmie taka tablica? Czy RAM byłby czynnikiem ograniczającym, tj. Jeśli mój komputer nie ma wystarczającej ilości pamięci RAM, czy może nie wygenerować tablicy?

Ponadto, jeśli istnieje bardziej efektywne wdrożenie tego kodu, byłbym wdzięczny wskazówki :)

+4

Zakładając 'double' precyzję, przy 8 bajtów każdy, jeśli naprawdę próbują przechowywać 10 miliardów, czyli 80 GB. Jeśli musisz zapytać, twój komputer nie ma wystarczającej ilości pamięci. To powiedziawszy, wygląda na to, że tworzysz je wszystkie, ale nie przechowujesz ich, więc powinieneś mieć się dobrze. – Gabe

Odpowiedz

17

Kilka punktów:

  • Wielkość pamięci NumPy tablic łatwo obliczyć. Jest to po prostu liczba elementów pomnożona przez rozmiar danych i niewielki stały narzut. Na przykład, jeśli twój cube.dtype jest int64 i ma 1 000 000 elementów, będzie wymagać 1000000 * 64/8 = 8,000,000 bajtów (8 Mb).
  • Jednak, jak zauważa @Gabe, 100 * 100 * 1 000 000 podwójnych pozycji będzie wymagać około 80 Gb.
  • Nie spowoduje to niczego, co mogłoby "zepsuć się", per-se, ale operacje będą śmiesznie powolne, ze względu na cały ten swapping twój komputer będzie musiał zrobić.
  • Twoje pętle nie zrobią tego, czego oczekujesz. Zamiast zastępowania elementu w cube, element = matrix po prostu zastąpi zmienną element, pozostawiając niezmienioną cube. To samo dotyczy modelu entry = random.rand() * 100.
  • Zamiast zobaczyć: http://docs.scipy.org/doc/numpy/reference/arrays.nditer.html#modifying-array-values
+1

Rzeczy rzeczywiście "zepsują się", jeśli przekroczysz całkowitą ilość dostępnej pamięci wirtualnej, co wydaje się bardzo prawdopodobne w tym przypadku, ponieważ niewielu ludzi ma> 80 GB przestrzeni wymiany –

+0

Nie jest to całkowicie przypadek, gdy mamy do czynienia z takimi funkcjami jak np. .zeros() '. Używana jest Lazy loading (przynajmniej w wersjach Linux), która pozwoli uniknąć użycia dużej ilości pamięci, aż do uzyskania dostępu do pewnych elementów. Na przykład możesz utworzyć macierz z 'np.zeros ((24000,24000)) i nie zajmuje dużo pamięci, ale jeśli robisz' np.random.random ((24000,24000)), zajmuje nieco ponad 4 GB. Lepsze wyjaśnienie: https://stackoverflow.com/questions/27574881/why-does-numpy-zeros-takes-up-little-space –

2

do "wewnętrznej" części swojej funkcji, spójrz na module numpy.random

import numpy as np 
matrix = np.random.random((100,100))*100 
Powiązane problemy