2010-04-24 2 views
5

파이썬의 멀티 프로세싱 라이브러리를 사용하여 성능을 향상 시키려고합니다. 특히 나는 자사의 map 기능을 사용하고 있습니다. 자, 하나의 처리 된 카운터 파트로 교체 할 때 어떤 이유로 높은 메모리 사용량을 얻지 못합니다. 그러나 맵의 멀티 프로세싱 버전을 사용하면 내 기억이 지붕을 통과하게됩니다. 기록을 위해 나는 많은 양의 메모리를 쉽게 먹을 수있는 무언가를하고있다.하지만 그 차이가 두 가지 사이에서 뚜렷한 차이를 일으키는 것은 무엇인가?다중 처리시에만 메모리 사용량이 높음

+0

기록의 경우 메모리 * 사용 *처럼 메모리 누출 * 소리가 들리지 않습니다. –

+0

매우 진실되고, 다시 한번, 나쁜 말씨. – Sandro

답변

4

다중 처리가 스레드를 사용하지 않는다는 것을 알고 있습니까? 당신이 "단일 스레드 대응"을 언급하기 때문에 나는 이것을 말한다.

multiprocessingmap을 통해 많은 데이터를 보냅니 까? 직렬화 멀티 프로세싱이 많은 경우에해야하는 것 같습니다. multiprocessing은 일반적으로 피클 링하는 데이터보다 많은 메모리를 차지하는 pickle을 사용합니다. 경우에 따라 map 메서드를 호출 할 때 새 프로세스가 만들어지는 fork()이있는 시스템에서는 일련 화를 피할 수 있지만 기존 프로세스에 새 데이터를 보내야 할 때마다 그렇게 할 수 없습니다.

multiprocessing으로 모든 실제 작업이 별도의 프로세스에서 수행되므로 주 프로세스의 메모리가 실제 수행하는 작업의 영향을받지 않아야합니다. 그러나 각 작업자 프로세스에는 사용자가 전송 한 데이터의 복사본이 있으므로 메모리의 총 사용량은 상당히 증가합니다. 이것은 때때로 CoW가있는 시스템에서 write-write-memory (직렬화하지 않는 것과 같은 경우)이지만, 파이썬의 메모리 사용은 이렇게 빠르게 쓰여지고 복사됩니다.

+0

사실, 다중 프로세스가 실제로 스레드를 사용하지 않는다는 것을 알게되어 죄송합니다. (따라서 이름) 그래서 파이프를 통해 정보를 보내는 것이 그것을 죽이는 것입니다. 많은 의미가 있습니다. 내가 직면하고있는 문제에 대한 해결책을 알고 있습니까? – Sandro

+1

적은 데이터로 전송하십시오. 또는 작은 덩어리로 보내주십시오. 또는 fork()를 사용하는 시스템에서 직렬화가 발생하지 않도록하십시오. 다중 프로세스가 새 프로세스를 시작하도록하십시오. –

관련 문제