2016-11-01 16 views
0

디스크에 많은 파일이 있어야합니다. 첫 번째 옵션은 멀티 스레드를 사용하며, SSD에서 매우 잘 수행됩니다. (스레드가 IO에 의해 차단되었을 때 GIL을 해제 할 때)파이썬 멀티 스레드는 읽기 전용 메모리 버퍼 바이 패스를 읽습니다. GIL

그러나 SSD가 없으면 속도를 향상시키고 싶기 때문에 (예를 들어 저장소에 저장하는 것처럼) 메모리에 미리로드하고 모든 스레드가 각 파일을 읽습니다. 메모리의 내용 불행하게도, GIL 때문에 아마도 dict에 자물쇠가있어, 그 속도는 SSD에서 파일을로드하는 것보다 더 느립니다!

내 질문에 어떤 솔루션을 잠금/GIL없이 읽기 전용 메모리 버퍼를 만들 수 있습니다? 램 디스크 같은 것>

+0

가능한 한 많은 속도를 원한다면 C 또는 C++ 또는 완전히 다른 언어로 컴파일 된 프로그램 (또는 속도가 중요한 부분)을 다시 작성하는 것이 어떻습니까? 그렇다면 네이티브 실행 파일을 실행할 것이기 때문에 GIL과 인터프리터 오버 헤드가 전혀 없습니다. –

답변

1

간단히 말해서, 아니요.

Python (특히 CPython)이 다중 스레드 언어 인 경우에도 인터프리터는 하나의 Python 코드 만 실행할 수 있습니다. 따라서 순수 Python 프로그램이 I/O (예 : 액세스 잠금없는 메모리 버퍼)를 차단하지 않아도 사용자가하는 일과 상관없이 단일 스레드 프로그램으로 저하됩니다. 휴면 스레드는 다시 작업하기 전에 활성 스레드가 양보 할 때까지 기다려야하기 때문에 단일 스레드 프로그램보다 성능이 떨어집니다.

(감사의 말 Graham Dumpleton!) solution 중 하나는 CPython의 C 확장을 작성하는 것입니다. 그리고 "G의 영역"을 입력 할 때 GIL을 놓습니다. GIL 보호 기능을 사용하지 않으면 파이썬에 액세스 할 수 없다는 점에주의하십시오. 그렇지 않으면 미묘한 버그가 발생하거나 직접 충돌 할 수 있습니다.

GIL을 사용하지 않는 구현이 몇 가지 있습니다 (예 : Jython 및 Cython). 당신은 그것들을 사용해 볼 수 있습니다. 그러나 올바른 멀티 스레드 프로그램을 작성하는 것은 어렵습니다. 빠른 멀티 쓰레드 프로그램 작성은 더욱 어렵습니다. 필자의 제안은 다중 스레드 대신 다중 프로세스 프로그램을 작성하는 것입니다. IPC 등을 통해 데이터를 전달하십시오 (예 : ZeroMQ, 사용하기 쉽고 빠름).

+1

아닙니다. CPython의 커버 아래에서 C 스레드가 사용되므로 기술적으로 여러 스레드가 계속 실행될 수 있지만 한 번에 하나의 스레드 만 파이썬 코드를 실행할 수 있습니다. 그래서 당신이 묘사하는 것과 미묘한 차이. CPython에서 C 확장을 사용하여 작동해야하는 데이터가 파이썬 데이터 객체에 대한 파이썬 전역 인터프리터 잠금을 필요로하지 않으면 동시에 여러 스레드를 동시에 실행할 수 있습니다. –

+0

수정 해 주셔서 감사합니다! 내가 다시 작성하자 ;-) – HKTonyLee

0

@HKTonyLee 답변에 몇 가지 사항을 추가하겠습니다.

그래서 파이썬에는이 GIL이 있습니다. 그러나 예를 들어 파일 I/O를 수행 할 때 릴리스됩니다. 즉, 파일을 병렬로 읽을 수 있습니다. 프로세스의 관점에서 볼 때 파일과 같은 것은 없지만 파일 설명자 (posix로 가정) 만 있으면 읽기에는 디스크에 저장할 필요가 없습니다.

파일을 (예 : tmpfs) 또는 ramdisk 또는 그와 동등한 파일로 옮기면 SSD에서 더 나은 성능을 얻을 수 있습니다. 그러나 위험에 유의하십시오. 파일을 수정해야하는 경우 업데이트가 손실 될 수 있습니다.