귀하의 질문은 I / O가 전체 분석에서 상당한 오버 헤드를 유발한다는 관찰에서 비롯된 것으로 가정합니다. 이 경우 계산과 I / O를 겹 치려고 시도 할 수 있습니다.
성공적인 접근 방식은 데이터에 액세스하는 방법과 해당 데이터에서 수행하는 계산에 따라 다릅니다. 패턴을 식별 할 수 있거나 데이터의 다른 영역에 대한 액세스가 미리 알려진 경우 "현재 청크"를 처리하는 동안 백그라운드에서 데이터의 "다음 청크"를 프리 페치하려고 시도 할 수 있습니다.
간단한 예로, 파일을 한 번만 통과하고 각 줄 또는 줄 집합을 처리하는 경우 스트림을 한 줄의 줄 (MB)로 나눌 수 있습니다. 그런 다음 청크를 반복 할 때마다 청크 i를 처리하는 동안 청크 i + 1을로드 할 수 있습니다.
상황이 더 복잡 할 수 있으며 더 많은 관련 솔루션이 필요합니다. 어쨌든 아이디어는 백그라운드에서 I / O를 수행하는 반면 프로세서에는 작업 할 데이터가 있습니다. 특정 문제에 대한 자세한 내용을 제공하면 더 자세히 살펴볼 수 있습니다.)
---- 자세한 내용을 제공 한 후 확장 버전 ----
나는 그 표기법을 이해하지는 못하지만, 당신이 말했듯이, 아이디어는 모든 사람과의 상호 작용입니다. 또한 데이터가 RAM에 적합 할 수 있다고 언급했습니다. 그런 다음 모든 데이터를로드하는 시간과 계산을 수행하는 시간을 측정하는 것으로 시작하겠습니다. 지금,
I / O의 백분율이 낮을 경우 (0.5 %, 2 %, 5 % 등의 오버 헤드에 신경 쓰지 않는 것처럼), 간단한 접근 방식을 사용하십시오 : 데이터로드 한 번에 계산하십시오. 보다 흥미로운 연구 측면을 위해 시간을 절약 할 수 있습니다.
오버 헤드를 감당할 수 없다면 Pedro가 제안한 내용을 살펴볼 수 있습니다. Aron Ahmadia가 언급 한 내용을 염두에두고 전체 구현을 수행하기 전에 테스트하십시오.
엔2엔
chunk1 및 chunk2로드
청크 i = 1 ~ n
비동기 적으로 청크 i + 1로드
j = i + 1 ~ n의 청크
청크 j + 1을 비동기 적으로로드
청크 i, j로 계산 (첫 번째 반복에 대해 *, 사전로드 청크 1과 2 *)
참고 : 이것은 빠르고 더러운 의사 코드이므로 인덱스를 조정해야합니다.
이를 구현하기 위해 소위 더블 버퍼링 을 사용하는 것이 일반적입니다. 입니다. 대략적으로 말하면, 두 개의 작업 공간에서 메모리를 나눕니다. 데이터가 백그라운드에서 작업 공간 1로로드되는 동안 프로세서는 작업 공간 2의 데이터로 계산됩니다. 각 반복마다 역할을 교환하십시오.
지금 좋은 참고 자료를 만들 수 없어서 죄송합니다.
[1] Out-of-core 알고리즘은 디스크에있는 데이터를 (효율적으로) 처리하기위한 메커니즘을 통합합니다. 인-코어 ( "인 -RAM")와 달리 아웃-코어라고합니다.
mmap
메인 코드 와 같은 것을 구현하기 전에 측정하고 테스트 하십시오. 많은 최신 운영 체제는 정기적read
으로 복잡성을 줄이면서 유사한 성능을 제공합니다 . 또한 Python의 mmap은 Windows 및 UNIX 메모리 맵에 대한 휴대용 인터페이스를 제공합니다.