Ich suche nach einem schnellen Weg, um große numpy Arrays zu erhalten. Ich möchte sie in einem Binärformat auf der Festplatte speichern und sie dann relativ schnell wieder in den Speicher zurücklesen. cPickle ist leider nicht schnell genug.
Ich habe numpy.savez und numpy.load gefunden . Aber das Seltsame ist, dass numpy.load eine npy-Datei in "memory-map" lädt. Das bedeutet, dass Arrays regelmäßig sehr langsam bearbeitet werden. Zum Beispiel wäre so etwas sehr langsam:
#!/usr/bin/python
import numpy as np;
import time;
from tempfile import TemporaryFile
n = 10000000;
a = np.arange(n)
b = np.arange(n) * 10
c = np.arange(n) * -0.5
file = TemporaryFile()
np.savez(file,a = a, b = b, c = c);
file.seek(0)
t = time.time()
z = np.load(file)
print "loading time = ", time.time() - t
t = time.time()
aa = z['a']
bb = z['b']
cc = z['c']
print "assigning time = ", time.time() - t;
Genauer gesagt wird die erste Zeile sehr schnell sein, aber die verbleibenden Zeilen, denen die Arrays zugewiesen obj
sind , sind lächerlich langsam:
loading time = 0.000220775604248
assining time = 2.72940087318
Gibt es eine bessere Möglichkeit, numpy Arrays zu erhalten? Idealerweise möchte ich mehrere Arrays in einer Datei speichern können.
np.load
sollte die Datei nicht mmap werden.numpy.savez
) wird standardmäßig die Arrays "träge geladen". Sie werden nicht gespeichert, aber erst geladen, wenn dasNpzFile
Objekt indiziert ist. (Daher die Verzögerung, auf die sich das OP bezieht.) Die Dokumentation fürload
überspringt dies und ist daher ein Hauch irreführend ...Antworten:
Ich bin ein großer Fan von hdf5 zum Speichern großer numpy Arrays. Es gibt zwei Möglichkeiten, mit hdf5 in Python umzugehen:
http://www.pytables.org/
http://www.h5py.org/
Beide sind so konzipiert, dass sie effizient mit Numpy-Arrays arbeiten.
quelle
Ich habe die Leistung (Raum und Zeit) auf verschiedene Arten verglichen, um Numpy-Arrays zu speichern. Nur wenige von ihnen unterstützen mehrere Arrays pro Datei, aber vielleicht ist es trotzdem nützlich.
Npy- und Binärdateien sind sowohl sehr schnell als auch klein für dichte Daten. Wenn die Daten spärlich oder sehr strukturiert sind, möchten Sie möglicherweise npz mit Komprimierung verwenden, was viel Platz spart, aber einige Ladezeit kostet.
Wenn Portabilität ein Problem ist, ist Binär besser als npy. Wenn die Lesbarkeit des Menschen wichtig ist, müssen Sie viel Leistung opfern, aber dies kann mit csv (das natürlich auch sehr portabel ist) ziemlich gut erreicht werden.
Weitere Details und den Code finden Sie im Github Repo .
quelle
binary
es besser ist alsnpy
für die Portabilität? Gilt das auch fürnpz
?Es gibt jetzt einen HDF5-basierten Klon
pickle
namenshickle
!https://github.com/telegraphic/hickle
BEARBEITEN:
Es besteht auch die Möglichkeit, direkt in ein komprimiertes Archiv zu "beizen", indem Sie Folgendes tun:
Blinddarm
quelle
savez () speichert Daten in einer Zip-Datei. Das Komprimieren und Entpacken der Datei kann einige Zeit dauern. Sie können die Funktion save () & load () verwenden:
Um mehrere Arrays in einer Datei zu speichern, müssen Sie nur zuerst die Datei öffnen und dann die Arrays nacheinander speichern oder laden.
quelle
Eine weitere Möglichkeit, Numpy-Arrays effizient zu speichern, ist Bloscpack :
und die Ausgabe für meinen Laptop (ein relativ altes MacBook Air mit einem Core2-Prozessor):
Das bedeutet, dass es sehr schnell gespeichert werden kann, dh der Engpass ist normalerweise die Festplatte. Da die Kompressionsverhältnisse hier jedoch ziemlich gut sind, wird die effektive Geschwindigkeit mit den Kompressionsverhältnissen multipliziert. Hier sind die Größen für diese 76-MB-Arrays:
Bitte beachten Sie, dass die Verwendung des Blosc- Kompressors von grundlegender Bedeutung ist, um dies zu erreichen. Das gleiche Skript, jedoch mit 'clevel' = 0 (dh Deaktivierung der Komprimierung):
ist eindeutig ein Engpass durch die Festplattenleistung.
quelle
Die Suchzeit ist langsam, da beim
mmap
Aufrufen derload
Methode der Inhalt des Arrays nicht in den Speicher geladen wird. Daten werden verzögert geladen, wenn bestimmte Daten benötigt werden. Und dies geschieht in Ihrem Fall bei der Suche. Aber die zweite Suche wird nicht so langsam sein.Dies ist eine nette Funktion,
mmap
wenn Sie ein großes Array haben und nicht ganze Daten in den Speicher laden müssen.Um Ihre Joblib zu lösen, können Sie jedes gewünschte Objekt mit
joblib.dump
zwei oder mehr Objekten sichernnumpy arrays
(siehe Beispiel)quelle