Parallelprogrammierung?
@Arp: Wenn Du `Pool.map()` verwendest dann sind die Ergebnisse in der Liste in der Reihenfolge wie die Eingabewerte im Argument. Egal in welcher Reihenfolge die *berechnet* wurden. Die Methode verhält sich da wie die Standardfunktion `map()`. Die einzige map-Variante von `Pool` die sich nicht so verhält ist `imap_unordered()` — und da sagt das der Name ja auch recht deutlich.
@Hyperion
Diese c,d,e variablen aus meinem Beispiel weiter oben sind an sich schon listen (oder numpy 1D arrays, ich weiss grad nicht mehr). Im Finalen Kubus erhält dann jedes Pixel, diese Liste als dritte Dimension hinzu.
@BlackJack
Ah, wunderbar. Das ist eine sehr nützliche Information!
Um es nur klarzustellen, wenn ich folgende funktion habe:
def bla():
return a,b
und wende dann result = Pool.map() mit den koordinaten (0,0),(0,1),(1,0),(1,1) an, steht in result quasi:
a,b,a,b,a,b,a,b für die jeweiligen koordinatentupel.
Right?
Dann kann ich nämlich nachträglich aus der Result immer die richtigen rausnehmen... in dem Fall z.b. kommt jedes Element mit ungeradem index in Liste 1, und jedes mit geradem index in Liste 2. Daraus sollte ich dann vermutlich über numpy.reshape wieder den 3D kubus bauen können.
Ich probiers gleich mal aus. Danke.
Diese c,d,e variablen aus meinem Beispiel weiter oben sind an sich schon listen (oder numpy 1D arrays, ich weiss grad nicht mehr). Im Finalen Kubus erhält dann jedes Pixel, diese Liste als dritte Dimension hinzu.
@BlackJack
Ah, wunderbar. Das ist eine sehr nützliche Information!
Um es nur klarzustellen, wenn ich folgende funktion habe:
def bla():
return a,b
und wende dann result = Pool.map() mit den koordinaten (0,0),(0,1),(1,0),(1,1) an, steht in result quasi:
a,b,a,b,a,b,a,b für die jeweiligen koordinatentupel.
Right?
Dann kann ich nämlich nachträglich aus der Result immer die richtigen rausnehmen... in dem Fall z.b. kommt jedes Element mit ungeradem index in Liste 1, und jedes mit geradem index in Liste 2. Daraus sollte ich dann vermutlich über numpy.reshape wieder den 3D kubus bauen können.
Ich probiers gleich mal aus. Danke.
@Arp: Im Ergebnis steht (a,b),(a,b),(a,b),(a,b) für die jeweiligen Koordinaten in der Eingabeliste.
PyPy sagt mir auch ehrlich gesagt nicht.
Ich hab da noch ne Frage. Habt ihr eine Idee wie ich eine Statusbar oder sowas in das parallele einbauen kann? Das einzige was mir einfällt ist anhand der aktuellen x y Koordinate und der Gesamtzahl der Pixel zu ermitteln wie weit man in dem Bild ist, allerdings ist das sehr ungenau da einige Pixel schneller als die anderen fertig sind.
Hier wärs wieder von Vorteil wenn jeder Thread auf eine globale Varibale zugreifen könnte. Könnte einfach an das Ende der Berechnungsfunktion die globale Varibale erhöhen bzw. auslesen und würde dann wissen wieviele Pixel wirklich fertig bearbeitet sind.
Ich hab da noch ne Frage. Habt ihr eine Idee wie ich eine Statusbar oder sowas in das parallele einbauen kann? Das einzige was mir einfällt ist anhand der aktuellen x y Koordinate und der Gesamtzahl der Pixel zu ermitteln wie weit man in dem Bild ist, allerdings ist das sehr ungenau da einige Pixel schneller als die anderen fertig sind.
Hier wärs wieder von Vorteil wenn jeder Thread auf eine globale Varibale zugreifen könnte. Könnte einfach an das Ende der Berechnungsfunktion die globale Varibale erhöhen bzw. auslesen und würde dann wissen wieviele Pixel wirklich fertig bearbeitet sind.
Es gibt ja bekanntlich(?) unterschiedliche Implementierungen von Python. Das von dir verwendete CPython kann als Referenzimplementierung betrachtet werden. PyPyist eine der Alternativen mit einem Fokus auf Performance.Arp hat geschrieben:PyPy sagt mir auch ehrlich gesagt nicht.
Ich denke PyPy wäre zumindest einen Versuch wert. Auch wenn numpypy noch nicht fertig ist, kann man es ja mal ausprobieren.
Solange du keine Funktionalität brauchst die hier aufgelistet ist, könnte es gehen: http://buildbot.pypy.org/numpy-status/latest.html
Solange du keine Funktionalität brauchst die hier aufgelistet ist, könnte es gehen: http://buildbot.pypy.org/numpy-status/latest.html
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
http://wiki.python.de/PyPyArp hat geschrieben:PyPy sagt mir auch ehrlich gesagt nicht.
Es ist in manchen Disziplinen um einiges schneller, siehe: http://speed.pypy.org/
Du meinst einen Fortschrittsbalken? Ich denke nicht, dass der sehr genau sein muss. Du willst ja nur wissen wo ungefähr er gerade ist.Arp hat geschrieben:PyPy sagt mir auch ehrlich gesagt nicht.
Ich hab da noch ne Frage. Habt ihr eine Idee wie ich eine Statusbar oder sowas in das parallele einbauen kann? Das einzige was mir einfällt ist anhand der aktuellen x y Koordinate und der Gesamtzahl der Pixel zu ermitteln wie weit man in dem Bild ist, allerdings ist das sehr ungenau da einige Pixel schneller als die anderen fertig sind.
Hier wärs wieder von Vorteil wenn jeder Thread auf eine globale Varibale zugreifen könnte. Könnte einfach an das Ende der Berechnungsfunktion die globale Varibale erhöhen bzw. auslesen und würde dann wissen wieviele Pixel wirklich fertig bearbeitet sind.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Naja, aber sollte ja nun prinzipiell nicht schwer sein abzuzählen wieviele Prozesse durchgelaufen sind.
Ich hab da was mit multiprocessing.Value gefunde, aber das klappt nicht ganz.
Hab mir dafür ein kleines Testprogramm geschrieben:
Code: Alles auswählen
from multiprocessing import Pool, Value
import numpy,time
def calc(sleeptime,n):
time.sleep(sleeptime)
n.value+=1
print str(n.value)+' Processes done.'
return sleeptime
randtimes = numpy.random.randint(10,size=100)
p = Pool(2)
n = Value('i',0)
result = p.map(calc,randtimes,n)
Aber was kriege ist nur eine Fehlermeldung.
unsupported operand type(s) for //: 'int' and 'Synchronized'
Das scheint irgendwie an der Übergabe von n zu liegen. Geht das vielleicht mit p.map nicht?
Übrigens, wenn dem Pool kein Argument für die Prozesszahl mitgegeben wird, dann ermittelt er diese Anzahl automatisch aus der Anzahl an Prozessorkernen. Das könnte unter Umständen portabler sein. Außer, es gibt berechtigte Gründe, die dagegen sprechen...
Und was dein Problem angeht: Das dritte (optionale) ist ja die `chunksize`. Da wird wohl eher ein normalen `Int`-Objekt erwartet.
Und was dein Problem angeht: Das dritte (optionale) ist ja die `chunksize`. Da wird wohl eher ein normalen `Int`-Objekt erwartet.
Zuletzt geändert von snafu am Dienstag 26. Juni 2012, 13:26, insgesamt 1-mal geändert.
Das Programm läuft auf einem Rechner den mehre Kollegen mitbenutzen. Ich will denen nicht gleich alle verfügbaren Kerne "wegnehmen"
Nee, ich habs grad gesehen, das Problem war, das es p.map(calc,(randtimes,n)) sein muss. Die Argumente müssen quasi zusammen übergeben werden.
Aber dann kommt ein anderer Fehler.
Synchronized objects should only be shared between processes through inheritance
Wenn das so weiter geht, speicher ich fertige pixelnummern in einer Datei und lade es jedes mal wieder... wär sowas wie eine Globale Variable, nur extrem langsam da ständig von der Platte geladen werden muss
Nee, ich habs grad gesehen, das Problem war, das es p.map(calc,(randtimes,n)) sein muss. Die Argumente müssen quasi zusammen übergeben werden.
Aber dann kommt ein anderer Fehler.
Synchronized objects should only be shared between processes through inheritance
Wenn das so weiter geht, speicher ich fertige pixelnummern in einer Datei und lade es jedes mal wieder... wär sowas wie eine Globale Variable, nur extrem langsam da ständig von der Platte geladen werden muss
Ok, ich hab eine Lösung, aber die ist etwas blöd.
Und zwar scheint das relativ einfach zu gehen wenn man statt pool multiprocessing.Process benutzt.... kann ich darauf auch map anwenden?
Also ursprünglich stand da ja result = p.map(...). Allergebnisse aller Prozesse wurden nun in result gespeichert, wohl geordnet.
Kann ich das auch mit Process machen?
Und zwar scheint das relativ einfach zu gehen wenn man statt pool multiprocessing.Process benutzt.... kann ich darauf auch map anwenden?
Also ursprünglich stand da ja result = p.map(...). Allergebnisse aller Prozesse wurden nun in result gespeichert, wohl geordnet.
Kann ich das auch mit Process machen?
Aber hast du mal Lust PyPy auszuprobieren? Es könnte nochmal für einen Performanceschub sorgen.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]