2017-12-28 7 views
1

나는 프로세스를 가로 질러 접근해야하는 18Gb 피클 파일을 가지고있다. 큰 읽기 전용 사전을 공유하는 방법/파이썬에서 멀티 프로세싱의 프로세스 전체 목록?

IOError: [Errno 11] Resource temporarily unavailable 

누군가가 그것 때문에 소켓 시간 초과 수 있습니다 제안

하지만 제한 시간을 늘리는 것이 도움이되지 않았다로 아닌 것 같아 : 나는 다음과 같은 문제를 얻고, 그러나

from multiprocessing import Manager 
import cPickle as pkl 
manager = Manager() 
data = manager.dict(pkl.load(open("xyz.pkl","rb"))) 

를 사용하여 시도 . 어떻게해야합니까? 프로세스간에 데이터를 공유하는 다른 효율적인 방법이 있습니까?

+1

'cPickle'? 당신은 파이썬 2를 사용하고 있습니까? 어쩌면 당신은 파이썬 3 시도해 줄 수 있습니다. –

+0

나는 pickle 파일을 manager.dict없이로드 할 수 있습니다. 그래서 그게 문제인지 의심 스럽네. –

답변

1

이것은 대부분 Shared memory in multiprocessing의 복제본이지만 간단한 배열이나 값이 아닌 dict 또는 list 개체를 찾고 있습니다.

불행히도 사전의 내부 구조가 복잡하고 (다른 Python 버전마다 다를 수 있기 때문에) 사전이나 목록을 공유하는 간단한 방법이 없습니다. Array 개체를 사용할 수 있도록 문제를 재구성 할 수 있다면 shared Array을 만들어 한번 채우고 잠금없이 사용할 수 있습니다. 이것은 많은 일반적으로 더 효율적입니다.

액세스 패턴에 따라 개체를 먼저로드 한 다음 프로세스 풀을 만드는 것 또한 유닉스와 유사한 시스템에서 복사시 복사 fork으로 작동하는 것이 가능합니다. 그러나 여기에는 보장이 없습니다.

오류 번호 11 = EAGAIN = "자원을 일시적으로 사용할 수 없음"은 Manager 인스턴스를 통해 막대한 값 집합을 보내려고 할 때 발생합니다. 관리자는 공유하지 않습니다 전혀 기본 데이터 : 대신 프록시는에 액세스하여 각 독립 프로세스가 자체 복사본을 가지며 한 프로세스가 값을 업데이트하면 해당 시스템에있는 모든 사용자에게 업데이트를 보냅니다 -나누는. 이 방법으로 모든 사람은 (결과적으로 액세스 타이밍에 따라) 값이 무엇인지에 대해 동의 할 수 있으므로 모두 이 동일한 값을 사용하는 것처럼 보입니다. 실제로는 각 개인이 개인 사본을 가지고 있습니다.

관련 문제