Ich verwende Python multiprocessing
-Modul, um große Anzahl Arrays parallel zu verarbeiten. Die Arrays sind im Master-Prozess unter Verwendung von numpy.load(mmap_mode='r')
memory-mapped. Danach gibt multiprocessing.Pool()
den Prozess ab (ich nehme an).NumPy vs. Multiprozessing und mmap
Alles scheint gut zu funktionieren, es sei denn ich wie immer Linien bin:
Attribute (" 'NoneType' Objekt hat kein Attribut 'sagen'",) in
<bound method memmap.__del__ of memmap([ 0.57735026, 0.57735026, 0.57735026, 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ], dtype=float32)>
ignoriert
in der Unittest-Protokolle. Die Tests laufen trotzdem gut.
Irgendeine Idee, was dort vor sich geht?
Verwenden von Python 2.7.2, OS X, NumPy 1.6.1.
UPDATE:
Nach einigem Debugging, gejagt I, die Ursache zu einem Code-Weg, der eine (kleine Scheibe) diesen speicherabgebildete numpy Array als Eingabe für einen Anruf Pool.imap
wurde mit.
Offenbar ist das "Problem" mit der Art und Weise übergibt seine Eingabe an die neuen Prozesse: Es verwendet Gurke. Dies funktioniert nicht mit mmap
ed numpy Arrays, und etwas im Inneren bricht, was zu dem Fehler führt.
Ich fand this reply von Robert Kern, die das gleiche Problem zu behandeln scheint. Er schlägt vor, einen speziellen Codepfad zu erstellen, wenn der Eingang imap
von einem Speicher-abgebildeten Array kommt: Speicher-Mapping des gleichen Arrays manuell im erzeugten Prozess.
Das wäre so kompliziert und hässlich, dass ich lieber mit dem Fehler und den zusätzlichen Speicherkopien leben würde. Gibt es eine andere Möglichkeit, die beim Ändern des vorhandenen Codes leichter wäre?
Joe deine Antworten rocken immer. Ich habe gerade versucht, so etwas herauszufinden. – YXD
Danke für den HDF-Tipp. Sieht aus wie eine große Veränderung, aber es kann sich lohnen, ich werde es überprüfen. – user124114