2015-01-16 8 views
1

Deap 프레임 워크를 사용하여 유전 알고리즘을 구현 중입니다. 알고리즘이 작동하지만 GA의 다중 프로세스 버전이 2GB의 단일 프로세스에 비해 9GB의 메모리를 사용하고 각 프로세스에 메모리를 할당했기 때문에 의심 스럽습니다. 실제로지도가 실행되는 즉시 사용 된 메모리가 증가합니다. 프로세스간에 공유되는 데이터는 읽기 전용으로 사용되므로 모두 동일한 메모리에 액세스 할 수 있습니다.Python - 다중 처리 및 공유 메모리

이것은 내 코드의 구조입니다.

def evaluate(individual, dataset=None): 

    penalty = dataset.compute(individual) 

    return penalty 


def initialize(): 
    dataset = dataset(file1, file2) 

    pool = multiprocessing.Pool() 
    toolbox.register("map", pool.map) 

    toolbox.register("evaluate", evaluate, dataset=dataset) 

    return toolbox, dataset 


def main(): 
    toolbox, dataset = initialize() 

    dataset.data = some_training_set 

    fitnesses = toolbox.map(toolbox.evaluate, population) 

    dataset.data = some_validation_set 

    fitnesses = toolbox.map(toolbox.evaluate, population) 

그렇다면 데이터 세트 (팬더를 사용하여 읽음)와 사전이 포함 된 클래스가 있습니다.

class Dataset: 

    def __init__(self, file1, file2): 
     self.data = read(file1) 
     self.dict = loadpickle(file2) 

    def compute(self, individual): 
     for row in self.data 
      # some stuff reading row and self.dict 

메모리를 공유하는 가장 쉬운 방법은 무엇입니까? self.data 및 self.dict에 대한 전역 변수를 사용하려고 시도했지만 아무 것도하지 않았습니다.

+0

포럼에서이 문제에 대한 몇 가지 주제를 읽었지만 해결책을 찾지 못했습니다. 데이터를 공유하는 올바른 방법이 무엇인지를 보여줄 수 있습니까? – user2297037

+0

'multiprocessing' 또는'threading'을 서로 바꾸어 사용할 수있는 GA 코드를 찾고 있다면'pathos.multiprocessing' 포크에서 ThreadingPool 인스턴스를 사용하여 실행할 때'mystic'을 사용하는 것이 좋습니다. GA는 병렬로 쓰레드를 사용하면서 엄청난 메모리 손상없이 원하는 것을 해줍니다. 여기에서 관련 코드를 모두 얻으십시오 : https://github.com/uqfoundation. 나는 진짜로 당신의 질문이 후에이기 때문에 이것을 대답했을 것입니다 ... 그러나 질문은 이미 닫혔습니다. –

답변

2

다중 처리 모듈은 스레드 모델이 아닌 다중 프로세스 모델을 사용하므로 각 프로세스는 공유 메모리를 사용하지 않고 메모리를 공유 할 수 없습니다 IPC 호출). Deap 프레임 워크는 메모리 공유에 필요한 경우 스레드를 사용하기 위해 두 번째로 재 설계해야합니다.