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 mmaped 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?

InformationsquelleAutor user124114 | 2012-04-01
Schreibe einen Kommentar