2016-06-01 34 views
8

Sono nuovo in Python e ho iniziato a utilizzare un algoritmo genetico (GA) per eseguire una sorta di adattamento della curva. Per quel GA sto usando la (fantastica) libreria pyevolve (http://pyevolve.sourceforge.net/) che è in grado di ridurre enormemente il tempo di calcolo usando il multiprocessing.PYTHON Rendere la variabile globale accessibile da ogni processo

Ecco dove si verifica il mio problema: la curva che voglio approssimare è una matrice che viene letta da un file excel e memorizzata come variabile globale all'inizio del mio programma. Quando si utilizza il modulo multiprocessing python, ogni processo crea la propria istanza di python con la propria variabile globale. Ciò fa sì che ogni individuo, in ogni generazione dell'algoritmo (ovvero ogni processo) apra e legga il file excel ancora e ancora. L'apertura di file excel di grandi dimensioni può causare un'enorme quantità di tempo, quindi sarebbe bello dover aprire quel file una sola volta e rendere l'array di lettura disponibile per ogni processo/individuo.

Il multiprocessing viene avviato nella libreria pyevolve e non desidero modificarlo per semplificare l'aggiornamento. Sfortunatamente ciò significa semplicemente passare la variabile al pool di processi tramite ad es.

p = Process(target=my_func,args=(my_array))

non è un'opzione per me. Questa è l'unica soluzione che ho trovato finora.

Qualcuno sa un altro modo per rendere my_array accessibile da ogni processo?

Grazie in anticipo!

+1

Forse è possibile trovare una soluzione adeguata lì: https://docs.python.org/2/library/multiprocessing.html#sharing-state-between-processes –

risposta

0

Volevo solo farvi sapere come ho risolto questo problema se qualcun altro si trova ad affrontare è:

La mia soluzione non è applicabile al problema generale relative pitone ma aiuta quando si utilizza pyevolve, che era abbastanza a mio Astuccio. Quello che non sapevo era che in pyevolve è possibile aggiungere dei parametri ai genomi o l'istanza algoritmo genetico tramite

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

E questi parametri si può accedere tramite

my_genome.getParam('xyz') e my_ga.getParam('xyz')

Questi parametri sono accessibili da ogni processo in modo che il mio problema è stato risolto e non ho avuto bisogno di pensare al problema generale di multiprocessing di Python. Spero che questo aiuti qualcun altro!

0

Controlla mmap, l'interfaccia Python per la creazione di file mappati in memoria che possono essere condivisi tra processi. Probabilmente si desidera qualcosa di simile al seguente:

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() 

ho usato this questione di capire come ottenere l'indirizzo di memoria fisica della mappa di memoria condivisa e riconvertirlo in un oggetto Python.

Suppongo che potresti anche farlo con qualsiasi oggetto in memoria invece di un mmap, ma non l'ho provato.

+0

Questo non funziona tra i processi. Funziona solo nel tuo esempio perché la mappatura originale rimane intatta su 'fork()'.In ogni caso, non può essere utilizzato per memorizzare strutture dati complesse. – duskwuff