numpy vs. multiprocessing und mmap
Ich bin mit Python multiprocessing
- Modul für die Verarbeitung von großen numpy-arrays in parallel. Die arrays sind memory-mapped-mit numpy.load(mmap_mode='r')
im master-Prozess. Danach multiprocessing.Pool()
Gabeln der Prozess (vermute ich).
Alles scheint zu funktionieren gut, außer ich bin immer Zeilen wie:
AttributeError("'NoneType' object has no attribute 'tell'",)
in `<bound method memmap.__del__ of
memmap([ 0.57735026, 0.57735026, 0.57735026, 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ], dtype=float32)>`
ignored
in der unittest-Protokolle. Die tests pass in Ordnung, dennoch.
Irgendeine Idee was da läuft?
Mit Python 2.7.2, OS X, NumPy 1.6.1.
UPDATE:
Nach einigem Debuggen habe ich gejagt, die Ursache für ein code-Pfad, der mit einem (kleinen Scheibe) dieser memory-mapped-numpy-array als Eingabe für ein Pool.imap
nennen.
Scheinbar das "Problem" ist mit der Art und Weise multiprocessing.Pool.imap
übergibt seine Eingabe an den neuen Verfahren: es nutzt Gurke. Das funktioniert nicht mit mmap
ed numpy-arrays, und etwas in bricht, das führt zu dem Fehler.
Fand ich diese Antwort von Robert Kern, scheint-Adresse das gleiche Problem. Er schlägt vor, die Schaffung eines speziellen code-Pfad, wenn die imap
input kommt von einem Speicher-array zugeordnet: memory-mapping des gleichen array manuell in die erzeugte Prozess.
Das wäre so kompliziert und hässlich, dass ich Lebe lieber mit dem Fehler und der zusätzliche Speicher kopiert. Gibt es eine andere Möglichkeit, das wäre leichter auf die änderung bestehender code?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Meine übliche Vorgehensweise (wenn Sie Leben können mit zusätzlichem Speicher kopiert) ist, alles zu tun, IO in einem Prozess und dann senden Sie die Dinge aus einem pool von worker-threads. Laden Sie eine Scheibe ein memmapped array in den Speicher nur tun
x = np.array(data[yourslice])
(data[yourslice].copy()
tut das nicht wirklich, das kann zu Verwirrung führen.).First off, lassen Sie uns generieren Sie einige test-Daten:
Können Sie reproduzieren Ihre Fehler mit so etwas wie dies:
Und wenn Sie wechseln Sie einfach zu nachgiebig
np.array(data[start:stop])
statt, Sie werden das problem zu beheben:Natürlich bedeutet dies eine extra Kopie im Arbeitsspeicher jedes Stück.
In der lange run, Sie werden wahrscheinlich feststellen, dass es leichter ist zu wechseln, Weg von memmapped Dateien und verschieben Sie Sie zu so etwas wie HDF. Das gilt besonders, wenn Ihre Daten multidimensional ist. (Ich würde empfehlen, die
h5py
, aberpyTables
ist schön, wenn Sie Ihre Daten mit "table-like".)Glück, auf jeden Fall!