2016-04-20 28 views
2

Ist es möglich, eine numpy.memmap ohne Kenntnis der Form zu laden und immer noch die Form der Daten zu erholen?laden np.memmap ohne Wissen Form

data = np.arange(12, dtype='float32') 
data.resize((3,4)) 
fp = np.memmap(filename, dtype='float32', mode='w+', shape=(3,4)) 
fp[:] = data[:] 
del fp 
newfp = np.memmap(filename, dtype='float32', mode='r', shape=(3,4)) 

In der letzten Zeile, mag ich nicht in der Lage sein, die Form zu spezifizieren und die Variable newfp immer noch (3,4) die Form zu haben, so wie es mit joblib.load passieren würde. Ist das möglich? Vielen Dank.

Antwort

6

Nicht, es sei denn, diese Information wurde irgendwo in der Datei explizit gespeichert. Soweit es np.memmap betrifft, ist die Datei nur ein flacher Puffer.

würde ich mit np.save empfehlen numpy Arrays bestehen bleiben, da dies auch die Metadaten, deren Dimensionen bewahrt, dtypes etc. Sie können auch, indem man die memmap_mode= Parameter np.load eine .npy Datei als memmap laden.

joblib.dump verwendet eine Kombination aus Beizen, um generische Python-Objekte zu speichern, und np.save, um numpige Arrays zu speichern.


Um ein leeres Memory-Mapped-Array von einem Sie numpy.lib.format.open_memmap verwenden kann .npy Datei gesichert initialisieren:

import numpy as np 
from numpy.lib.format import open_memmap 

# initialize an empty 10TB memory-mapped array 
x = open_memmap('/tmp/bigarray.npy', mode='w+', dtype=np.ubyte, shape=(10**13,)) 

Sie überrascht von der Tatsache könnte sein, dass diese auch wenn die Anordnung gelingt, ist größer als der gesamte verfügbare Speicherplatz (mein Laptop hat nur eine 500GB SSD, aber ich habe gerade eine 10TB memmap erstellt). Dies ist möglich, weil die erstellte Datei sparse ist.

Kredit für die Entdeckung open_memmap sollte kiyo's previous answer here gehen.

+0

Die Sache ist ich mit sehr großen Datenmengen zu tun habe und 'memmap' vermeidet das Auffüllen des gesamten RAM. Ich verwende es auch mit 'joblib.Parallel', um parallel auf Platte zu schreiben. – Michael

+0

Wie bereits erwähnt, können Sie eine '.npy'-Datei auch als Speichermapping-Array öffnen, indem Sie den Parameter' memmap_mode = 'an' np.load' übergeben. Eine andere Option wäre, eine Kombination von 'joblib.dump' und' joblib.load' mit dem Parameter 'memmap_mode =' zu verwenden, der 'np.save' und' np.load' unter der Haube verwendet. –

+0

Angenommen, ich muss 100 GB Daten initialisieren, und ich habe nur 32 GB RAM. In dieser Situation bin ich gezwungen, 'memmap' im Schreibmodus zu verwenden. Nun funktioniert 'np.load' in einem solchen Fall nicht: Ich muss es im Lesemodus erneut mit' memmap' lesen. Die Frage ist, wie man das macht, ohne die Form der Daten zu kennen und trotzdem die richtigen Formen zu erhalten. – Michael

1

Die answer von @ali_m ist absolut gültig. Ich möchte meine persönliche Präferenz erwähnen, falls es jemandem hilft. Ich beginne immer meine Memmap-Arrays mit der Form als die ersten 2 Elemente. Dadurch ist so einfach wie:

# Writing the memmap array 
fp = np.memmap(filename, dtype='float32', mode='w+', shape=(3,4)) 
fp[:] = data[:] 
fp = np.memmap(filename, dtype='float32', mode='r+', shape=(14,)) 
fp[2:] = fp[:-2] 
fp[:2] = [3, 4] 
del fp 

Oder einfacher noch:

# Writing the memmap array 
fp = np.memmap(filename, dtype='float32', mode='w+', shape=(14,)) 
fp[2:] = data[:] 
fp[:2] = [3, 4] 
del fp 

Dann können Sie bequem die Array lesen als:

#reading the memmap array 
newfp = np.memmap(filename, dtype='float32', mode='r') 
row_size, col_size = newfp[0:2] 
newfp = newfp[2:].reshape((row_size, col_size)) 
+0

Das ist in Ordnung, solange Sie nur 2D-Arrays mit einem festen dtype verwenden (auch sollten Sie Array-Dimensionen wirklich als Ganzzahlen und nicht als Gleitkommazahlen speichern). Der Hauptvorteil bei der Verwendung von 'np.save' oder' numpy.lib.format.open_memmap' besteht darin, dass diese automatisch Metadaten speichern, die die Form und den dtyp des Arrays angeben. –