Warum ist dieses numpy Array zu groß, um zu laden?

Ich habe eine 3.374Gb npz Datei, myfile.npz .

Ich kann es lesen und die Dateinamen ansehen:

 a = np.load('myfile.npz') a.files 

Gibt

 ['arr_1','arr_0'] 

Ich kann in 'arr_1' ok lesen

 a1=a['arr_1'] 

Allerdings kann ich nicht in arr_0 laden oder seine Form lesen:

 a1=a['arr_0'] a['arr_0'].shape 

Beide oben Operationen geben folgende Fehlermeldung:

 ValueError: array is too big 

Ich habe 16 GB RAM, von denen 8.370Gb zur Verfügung steht. Also das Problem scheint nicht im Zusammenhang mit dem Gedächtnis. Meine Fragen sind:

  1. Soll ich diese Datei lesen können?

  2. Kann jemand diesen Fehler erklären?

  3. Ich habe mich mit np.memmap , um das zu np.memmap – ist das ein vernünftiger Ansatz?

  4. Welche Debugging-Ansatz sollte ich verwenden?

BEARBEITEN:

Ich habe Zugang zu einem Computer mit mehr RAM (48GB) und es geladen. Der dtype war in Wirklichkeit complex128 und das unkomprimierte Gedächtnis a['arr_0'] war 5750784000 Bytes. Es scheint, dass ein RAM Overhead erforderlich sein kann. Entweder das oder meine vorhergesagte Menge an verfügbarem RAM war falsch (ich habe Windows Sysinternals RAMmap).

One Solution collect form web for “Warum ist dieses numpy Array zu groß, um zu laden?”

Ein np.complex128 Array mit den Dimensionen (200, 1440, 3, 13, 32) sollte etwa 5,35 GiB unkomprimiert aufnehmen, also wenn du wirklich 8,3 GB kostenloses, adressierbares Gedächtnis hast, dann musst du grundsätzlich in der Lage sein zu laden Das Array

Allerdings, basierend auf Ihren Antworten in den Kommentaren unten, verwenden Sie 32-Bit-Versionen von Python und numpy. In Windows kann ein 32-Bit-Prozess nur bis zu 2 GB Speicher (oder 4 GB) adressieren, wenn die Binärdatei mit dem IMAGE_FILE_LARGE_ADDRESS_AWARE Flag kompiliert wurde, die meisten 32-Bit-Python-Distributionen sind nicht). Folglich ist Ihr Python-Prozess auf 2 GB Adressraum beschränkt, unabhängig davon, wie viel physikalischer Speicher Sie haben.

Sie können entweder installieren 64-Bit-Versionen von Python, numpy, und alle anderen Python-Bibliotheken, die Sie benötigen, oder leben mit dem 2GB-Limit und versuchen, um sie herum zu arbeiten. Im letzteren Fall kannst du mit der Speicherung von Arrays, die die 2GB-Grenze vor allem auf der Festplatte übersteigen (z. B. mit np.memmap ), aber ich würde Ihnen raten, für die Option # 1 zu gehen, da Operationen auf Memmaped Arrays sind viel langsamer in Die meisten Fälle als für normale np.array s, die ganz im RAM wohnen.


Wenn du bereits einen anderen Rechner hast, der genügend RAM hat, um das ganze Array in den Core Memory zu laden, dann würde ich vorschlagen, dass du das Array in einem anderen Format speicherst (entweder als plain np.memmap binary oder vielleicht besser in einer HDF5-Datei mit PyTables Oder H5py ). Es ist auch möglich (wenn auch etwas schwieriger), das Problem-Array aus der .npz Datei zu extrahieren, ohne es in den RAM zu laden, damit du es dann als np.memmap Array auf der Festplatte np.memmap :

 import numpy as np # some random sparse (compressible) data x = np.random.RandomState(0).binomial(1, 0.25, (1000, 1000)) # save it as a compressed .npz file np.savez_compressed('x_compressed.npz', x=x) # now load it as a numpy.lib.npyio.NpzFile object obj = np.load('x_compressed.npz') # contains a list of the stored arrays in the format '<name>.npy' namelist = obj.zip.namelist() # extract 'x.npy' into the current directory obj.zip.extract(namelist[0]) # now we can open the array as a memmap x_memmap = np.load(namelist[0], mmap_mode='r+') # check that x and x_memmap are identical assert np.all(x == x_memmap[:]) 
  • Auswahl über mehrere Spalten mit Python-Pandas?
  • Pandas / Python: 2D Histogramm fehlschlägt mit Wertfehler
  • Verkleinern Sie das NumPy-Array auf eine kleinere Größe ohne Kopie
  • Warum passt scipy.optimize.curve_fit nicht korrekt zu den Daten?
  • Warum ist numpy.array () ist manchmal sehr langsam?
  • Füge mehrere Matrix hinzu, ohne eine neue zu bauen
  • Warum bietet numpy.linalg.solve () präzisere Matrixinvertierungen als numpy.linalg.inv ()?
  • Animation einer 3D-Oberfläche aus berechneten Matrizen
  • Teilen Sie eine numpy Array in Gunicorn Prozesse
  • So finden Sie linear unabhängige Zeilen aus einer Matrix
  • Zählen, wie oft eine Zeile in einer Matrix (numpy)
  • Python ist die beste Programmiersprache der Welt.