나는 multiprocessing
모듈과 병렬 처리하기를 원하는 많은 "당혹스럽지 않은"병렬 프로젝트를 실행합니다. 그러나 대용량 파일 (2GB 이상)을 읽고, 줄 단위로 처리하고, 기본 계산을 실행 한 다음 결과를 작성하는 작업이 종종 포함됩니다. 파이썬의 멀티 프로세싱 모듈을 사용하여 파일을 분할하고 처리하는 가장 좋은 방법은 무엇입니까? Queue
또는 JoinableQueue
을 multiprocessing
에 사용해야합니까? 또는 Queue
모듈 자체입니까? 또는, 파일 풀을 반복 실행하여 multiprocessing
을 사용하여 프로세스 풀에 매핑해야합니까? 필자는 이러한 접근법을 실험했지만 오버 헤드는 데이터를 한 줄에 하나씩 분배하는 데 엄청난 양입니다. 필자는 cat file | process1 --out-file out1 --num-processes 2 | process2 --out-file out2
을 사용하여 첫 번째 프로세스 입력의 특정 비율을 두 번째 입력 (this post 참조)에 직접 전달하는 가벼운 파이프 필터 설계에 착수했지만 완전한 솔루션이 Python에 포함되도록하고 싶습니다.파이썬에서 대용량 파일을 멀티 프로세싱을 위해 나누는 가장 좋은 방법은 무엇입니까?
놀랍게도 Python 설명서는 multiprocessing
설명서의 프로그래밍 가이드 라인에 대한 긴 섹션에도 불구하고이를 수행하는 표준 방법을 제안하지 않았습니다.
감사합니다, 빈스
추가 정보 : 라인 당 처리 시간이 달라집니다. 일부 문제는 빠르며 간혹 I/O 바운드가 아니며 일부는 CPU 바운드입니다. CPU 종속적 인 비 종속적 인 작업은 처리 기능에 데이터를 할당하는 비효율적 인 방법조차도 벽시계 시간 측면에서 여전히 유리할 수 있도록 병렬화로 인해 게시를 얻습니다.
주요 예는 라인에서 필드를 추출하고 다양한 비트 플래그를 검사하며 특정 플래그가있는 라인을 완전히 새로운 포맷으로 새 파일에 쓰는 스크립트입니다. 이것은 I/O 바운드 문제처럼 보이지만 파이프가있는 저렴한 동시 버전으로 실행하면 약 20 % 빨라졌습니다. 내가 풀과 맵으로 실행하거나 multiprocessing
에 큐를 넣을 때 항상 100 % 이상 느려집니다.
이것은 대담한 스크립팅 언어에 대한 내 큰 불만입니다. 동시 처리는 스레드가없는 고통입니다. . 물론 완료 할 수는 있지만 스레드 및 잠금 모델을 사용하면 작업이 훨씬 간단 해집니다. –
쓰레딩 된 "병렬"버젼은 쓰레드가 프로세스보다 빠르게 작성된다는 사실을 제외하고 결코 빠르지 않을 것입니다.GIL은 CPU 바인딩 된 다중 스레드 프로그램의 큰 병목입니다. 또한 프로세스/스레드간에 공유해야하는 변경 가능한 객체가 없기 때문에 멀티 프로세싱보다 멀티 스레딩이 실제로 필요하지 않습니다. – Vince
@Vince 실제로, 그것은 모두 정확한 상황에 의존합니다. 너 안에는 절대로 없을거야. 다른 사람들에게는 그것이 가능할 수도 있습니다. 요점은 (C에서) 수행해야했던 동시 작업의 대부분에 대해 스레드와 잠금이 훨씬 간단한 모델을 제공 할 때 적절한 IPC에 필요한 여분을 사용하는 것은 거의 정당화되지 않았다는 것입니다. 다른 시스템에서보다 잘 확장해야하는 더 큰 문제의 경우에는 다른 이야기입니다. –