2014-10-05 12 views
5

Ich muss Teile eines riesigen numpy Array in einer Memory-Mapped-Datei gespeichert lesen, die Daten verarbeiten und für einen anderen Teil des Arrays wiederholen. Das ganze numpy Array benötigt ca. 50 GB und mein Rechner hat 8 GB RAM.Memory-Mapped-Datei für numpy Arrays

Ich erstellte zunächst die Speicherabbilddatei mit numpy.memmap, indem ich viele kleinere Dateien einlud und ihre Daten verarbeitete und dann die verarbeiteten Daten in die memmap-Datei schrieb. Während der Erstellung der Memmap-Datei hatte ich keine Speicherprobleme (ich verwendete memmap.flush() in regelmäßigen Abständen). Hier ist, wie ich die Memory-Mapped-Datei zu erstellen:

mmapData = np.memmap(mmapFile,mode='w+', shape=(large_no1,large_no2)) 
for i1 in np.arange(numFiles): 
    auxData = load_data_from(file[i1]) 
    mmapData[i1,:] = auxData 
    mmapData.flush() % Do this every 10 iterations or so 

Allerdings, wenn ich versuche, kleine Portionen zuzugreifen (< 10 MB) der memmap Datei, es ist meine ganze ram flutet, wenn das memmap Objekt erstellt wird. Die Maschine verlangsamt sich drastisch und ich kann nichts machen. Hier ist, wie ich versuche, in den Daten aus dem Speicher abgebildeten Datei zu lesen:

mmapData = np.memmap(mmapFile, mode='r',shape=(large_no1,large_no2)) 
aux1 = mmapData[5,1:1e7] 

Ich dachte mmap oder numpy.memmap verwenden soll mich erlauben, Teile der massiven Arrays zuzugreifen, ohne zu versuchen, die ganze Sache in dem Speicher zu laden. Was vermisse ich?

Verwende ich das falsche Tool, um auf Teile eines großen, auf der Festplatte gespeicherten Arrays (> 20 GB) zuzugreifen?

+0

Ich habe es noch nicht reproduziert, aber das scheint mir auch überraschend. Ich dachte Scheiben waren nur dicke Zeiger ... Sind Sie sicher, dass die Ausführung nicht über die Aux1 Aufgabe hinausgeht? Wenn es über die Zuweisung hinausgeht und Sie das lesen, wird mehr Speicher geladen als erwartet, da Cache-Zeilen größer als 5 Byte (normalerweise 64 Byte) sind, je nachdem, ob Sie order = 'C verwenden "oder" F ". Aber das sollte immer noch nicht genug sein, um eine Maschine mit 8 GB verfügbarem RAM zu beschichten, also ist dies keine Antwort. –

Antwort

1

Könnte es sein, dass Sie eher virtuellen als physischen Speicherverbrauch suchen und die Verlangsamung von etwas anderem kommt?