Parallelprogrammierung?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
BlackJack

@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.
Arp
User
Beiträge: 65
Registriert: Dienstag 15. März 2011, 13:21

@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.
BlackJack

@Arp: Im Ergebnis steht (a,b),(a,b),(a,b),(a,b) für die jeweiligen Koordinaten in der Eingabeliste.
Arp
User
Beiträge: 65
Registriert: Dienstag 15. März 2011, 13:21

Wunderbar, ich habs hingekommen. Es tut genau das was es tun soll, und läuft parallel. Der Code läuft jetzt in 1.5 Stunden statt 30 Stunden.... das ist geil :)

Danke für die Hilfe!
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

schon mal über pypy nachgedacht?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

jens hat geschrieben:schon mal über pypy nachgedacht?
numpy ist mit PyPy aber noch etwas wackelig.
Arp
User
Beiträge: 65
Registriert: Dienstag 15. März 2011, 13:21

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.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Arp hat geschrieben:PyPy sagt mir auch ehrlich gesagt nicht.
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.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

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
[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]
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Arp hat geschrieben:PyPy sagt mir auch ehrlich gesagt nicht.
http://wiki.python.de/PyPy

Es ist in manchen Disziplinen um einiges schneller, siehe: http://speed.pypy.org/

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

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.
Du meinst einen Fortschrittsbalken? Ich denke nicht, dass der sehr genau sein muss. Du willst ja nur wissen wo ungefähr er gerade ist.
[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]
Arp
User
Beiträge: 65
Registriert: Dienstag 15. März 2011, 13:21

:)

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)
Das sollte, zumindest denke ich das, 2 Prozesse gleichzeitig ausführen, jeder bekommt eine zufällige sleeptime. Wenn die Zeit abgewartet ist, sollte n erhöht werden udn der Ausdruck kommen.

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?
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ü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.
Zuletzt geändert von snafu am Dienstag 26. Juni 2012, 13:26, insgesamt 1-mal geändert.
Arp
User
Beiträge: 65
Registriert: Dienstag 15. März 2011, 13:21

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 :evil:
Arp
User
Beiträge: 65
Registriert: Dienstag 15. März 2011, 13:21

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?
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

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]
Antworten