Ich bin neu bei Python und habe angefangen, einen genetischen Algorithmus (GA) zu verwenden, um eine Art Kurvenanpassung durchzuführen. Für diesen GA verwende ich die (tolle) Pyvevolve-Bibliothek ( Ссылка ), das die Rechenzeit durch Multiprocessing enorm reduzieren kann.
Hier tritt mein Problem auf: Die Kurve, die ich approximieren möchte, ist ein Array, das aus einer Excel-Datei gelesen und als globale Variable am Anfang meines Programms gespeichert wird. Bei Verwendung des Python-Multiprocessing-Moduls erstellt jeder Prozess seine eigene Instanz von Python mit einer eigenen globalen Variablen. Das veranlasst jedes Individuum, in jeder Generation des Algorithmus (bedeutet jeden Prozess), die Excel-Datei immer wieder zu öffnen und zu lesen. Das Öffnen großer Excel-Dateien kann eine immense Menge an Zeit verursachen, so dass es nett wäre, diese Datei nur einmal zu öffnen und das Lese-Array für jeden Prozess / jedes Individuum verfügbar zu machen.
Das Multiprocessing wird in der pyevolve-Bibliothek gestartet und ich möchte es nicht ändern, damit es leicht zu aktualisieren ist. Leider bedeutet dies, dass die Variable nur über den Prozesspool übergeben wird z.B.
p = Process(target=my_func,args=(my_array))
ist keine Option für mich. Dies ist die einzige Lösung, die ich bisher gefunden habe.
Kennt jemand eine andere Möglichkeit, my_array von jedem Prozess zugänglich zu machen?
Vielen Dank im Voraus!
Ich wollte Sie nur wissen lassen, wie ich dieses Problem gelöst habe, wenn es jemand anderes vor Augen hat:
Meine Lösung gilt nicht für das allgemeine python-bezogene Problem, aber es hilft bei der Verwendung von pyevolve, was in meinem Fall ausreichend war. Was ich nicht wusste, ist, dass Sie in pyevolve Parameter zu Ihren Genomen oder Ihrer genetischen Algorithmusinstanz über
hinzufügen können my_genome.setParams(xyz=my_array)
oder
my_ga.setParams(xyz=my_array)
Und diese Parameter können über
erreicht werden my_genome.getParam('xyz')
und my_ga.getParam('xyz')
Diese Parameter sind für jeden Prozess zugänglich, so dass mein Problem gelöst wurde und ich nicht über das allgemeine Python-Multiprocessing-Problem nachdenken musste. Ich hoffe, dass dies jedem anderen hilft!
Sehen Sie sich mmap an, die Python-Schnittstelle zum Erstellen von Speicherabbilddateien, die von Prozessen gemeinsam genutzt werden können. Sie möchten wahrscheinlich etwas wie das Folgende:
%Vor%Ich habe diese Frage verwendet, um herauszufinden, wie man das bekommt physikalische Speicheradresse der Shared Memory Map und wandle sie zurück in ein Python-Objekt.
Ich nehme an, Sie könnten dies auch mit jedem Objekt im Speicher tun, anstatt mit einer mmap, aber ich habe es nicht versucht.
Tags und Links python multiprocessing global pyevolve