파이썬은 3동시 데이터 로더를위한 깨끗하고 비단뱀적인 방법?
나는 정말 깨끗하고, 파이썬 동시 데이터 로더가 어떠해야하는지 알고 싶습니다. 메모리에 완전히 들어 맞기에는 너무 큰 데이터에 대해 무거운 계산을하는 내 프로젝트에이 방법이 필요합니다. 따라서 동시에 실행해야하는 데이터 로더를 구현하고 대기열에 데이터를 저장하므로 다음 프로세스가 (다음에로드되는 동안) &을 준비하는 동안 작업 할 수 있습니다. 물론 대기열은 비어있을 때 차단해야합니다 (기본 프로세스는 더 많은 항목을 소비하려고 시도합니다 - 대기열은 새 데이터를 기다려야 함) 또는 전체 (작업자 프로세스는 주 프로세스가 대기열에서 데이터를 소비하여 대기 상태가되지 않도록 대기해야합니다. 메모리 오류).
파이썬의 multiprocessing
모듈 (multiprocessing.Queue
및 multiprocessing.Process
)을 사용하여이 필요를 충족시키는 클래스를 작성했습니다. 클래스의 중요한 부분은 다음과 같이 구현됩니다.
클래스에는 몇 가지 메소드가 있지만 "편의 기능"을위한 클래스입니다. 예를 들어, 각 파일의로드 빈도, 전체 데이터 세트의로드 빈도 등을 계산하지만, Python에서 구현하기가 쉽고 계산 시간을 많이 낭비하지 않습니다 (세트, dicts, ..).).
데이터 부분 자체는 I/O 및 사전 처리로 인해 몇 초가 걸릴 수도 있습니다. 그것이 제가 동시에 일어나는 이유입니다.
ConcurrentLoader
해야 : get_batch_data
호출하지만, 큐가 비어있는 경우
- 블록의 주요 과정은 대기열이 꽉 찬 경우, 메모리 부족 오류를 방지하고에서
while True
을 방지하기 위해 리소스 낭비 - 은
ConcurrentLoader
을 사용하는 모든 클래스에 "투명"해야합니다. 실제로 데이터 경로를 제공하고get_batch_data
을 실제로 사용하지 않고 ("간편한 사용") 주요 프로세스가 다시
이러한 목표를 (난 아무것도 잊어 버린?) 나는 현재 구현을 향상시키기 위해 무엇을해야하는지 고려 자원을 확보하기 위해 죽을 때
ConcurrentLoader
대략이 설정을 따를 것입니다 사용 모든 클래스 :
class Foo:
...
def do_something(self):
...
data1 = ConcurrentLoader("path/to/data1", 64, 8)
data2 = ConcurrentLoader("path/to/data2", 256, 16)
...
sample1 = data1.get_batch_data()
sample2 = data2.get_batch_data()
... # heavy computations with data contained in 'sample1' & 'sample2'
# go *here*
는 자신의, 청소기, 더 파이썬 접근 방식을 내 접근 방식을 개선하거나 공급하기 위해 어떤 종류의 실수를 지적 해주십시오 중 하나. multiprocessing.Queue
이/빈 완전하고 자동의 발생에 get()
/put()
가 호출 될 때 차단