2016-06-01 14 views
8

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 (http://pyevolve.sourceforge.net/), die in der Lage ist, die Rechenzeit durch Verwendung von Multiprocessing enorm zu reduzieren.PYTHON Globale Variable von jedem Prozess aus zugänglich machen

Hier tritt mein Problem auf: Die Kurve, die ich annähern möchte, ist ein Array, das aus einer Excel-Datei gelesen und als eine 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, daher wäre es schön, 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 Pyvevolve-Bibliothek initiiert und ich möchte es nicht ändern, damit es einfach zu aktualisieren ist. Unglücklicherweise bedeutet dies, dass die Variable einfach über , 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!

+1

Vielleicht finden Sie dort eine geeignete Lösung: https://docs.python.org/2/library/multiprocessing.html#sharing-state-between-processes –

Antwort

0

Ich wollte Ihnen nur mitteilen, wie ich dieses Problem gelöst, wenn jemand anderes es konfrontiert ist:

Meine Lösung gilt nicht für das allgemeine Problem Python, aber es hilft, wenn Pyevolve verwenden, die genug war mein Fall. Was ich nicht wusste, war, dass in Pyevolve Sie Parameter an Ihre Genome oder Ihre genetischen Algorithmus Instanz über

my_genome.setParams(xyz=my_array) oder my_ga.setParams(xyz=my_array)

Und diese Parameter können über

my_genome.getParam('xyz') zugegriffen werden und hinzufügen 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!

0

Schauen Sie sich mmap, die Python-Schnittstelle zum Erstellen von Speicher-Mapped-Dateien, die zwischen den Prozessen geteilt werden können. Sie wollen wahrscheinlich etwas wie folgt aus:

import mmap 
import os 
import ctypes 

mm = mmap.mmap(-1, 13) 
mm.write('Hello world!') 

mm_addr = id(mm) 

with open('shared_id', 'w') as f: 
    f.write(str(mm_addr)) 

pid = os.fork() 

if pid == 0: # In a child process 
    id_from_file = long(open('shared_id').read()) 
    loaded_mm = ctypes.cast(id_from_file, ctypes.py_object).value 
    loaded_mm.seek(0) 
    print loaded_mm.readline() 
    loaded_mm.close() 

I this Frage verwendet, um herauszufinden, wie die physische Speicheradresse des Shared-Memory-Karte zu bekommen und es zurück in ein Python-Objekt zu konvertieren.

Ich nehme an, Sie könnten dies auch mit jedem Objekt im Speicher statt einer mmap tun, aber ich habe es nicht versucht.

+0

Dies funktioniert nicht prozesseübergreifend. Es funktioniert nur in Ihrem Beispiel, weil das ursprüngliche Mapping über das 'fork()' hinweg erhalten bleibt.In jedem Fall kann es nicht zum Speichern komplexer Datenstrukturen verwendet werden. – duskwuff

Verwandte Themen