대용량 데이터 세트의 계산 문제에 대한 I / O 전략?


15

저의 연구 그룹은 분자 역학에 중점을 두었습니다. 분자 역학은 분명히 단일 궤도의 일부로 기가 바이트의 데이터를 생성하여 분석해야합니다.

우리가 우려하는 몇 가지 문제는 데이터 세트의 상관 관계와 관련이 있습니다. 즉, 순차적 인 접근 방식을 사용하지 않고 메모리에서 많은 양의 데이터를 추적하고 분석해야합니다.

내가 알고 싶은 것은 큰 데이터 세트의 I / O를 스크립트로 처리하기위한 가장 효율적인 전략입니다. 일반적으로 파이썬 기반 스크립트는 C 또는 Fortran보다 파일 I / O 코딩이 훨씬 덜 고통스럽기 때문에 처리해야하지만 처리해야 할 수천 또는 수억 줄이있을 때 가장 좋은 방법이 무엇인지 명확하지 않습니다. . C에서 코드의 파일 입력 부분을 수행해야합니까, 아니면 다른 전략이 더 유용한가요? (전체 어레이를 메모리에 미리로드하는 것만으로 일련의 "청크"(MB 단위) 순차 읽기보다 낫습니까?

몇 가지 추가 사항 :

  • 우리는 주로 "온라인"도구 라기보다는 사후 처리를위한 스크립팅 도구를 찾고 있습니다. 따라서 파이썬을 사용합니다.

  • 위에서 언급했듯이 MD 시뮬레이션을 수행하고 있습니다. 관심있는 주제 중 하나는 확산 계산인데,이를 위해서는 아인슈타인 확산 계수를 얻어야합니다.

    =16Δ(엑스(+Δ)엑스())2

답변:


6

귀하의 질문은 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")와 달리 아웃-코어라고합니다.


7

나는 전에 비슷한 문제를 해결해야했으며, 가장 좋아하는 솔루션은 C에도 불구하고 메모리 매핑 I / O 를 사용하는 것입니다 ...

파일의 기본 원리는 매우 간단합니다. 파일을 열고 파일을 읽는 대신 파일을 메모리에 직접로드하여 마치 거대한 배열 인 것처럼 액세스합니다. 효율적으로 만드는 요령은 운영 체제 가 실제로 파일을로드하지 않고로드 해야하는 스왑 아웃 메모리 처럼 취급한다는 것 입니다. 파일에서 지정된 바이트에 액세스하면 파일의 해당 부분에 대한 메모리 페이지가 메모리로 교체됩니다. 파일의 다른 부분에 계속 액세스하고 메모리가 빡빡하면 덜 사용 된 부분이 자동으로 교체됩니다!

빠른 Google 검색에 따르면 Python에서도 사용할 수 있습니다. 16.7. mmap — 메모리 매핑 된 파일 지원 이지만 파이썬이 실제로 같은지 알 수있을만큼 충분하지 않습니다.


1
mmap메인 코드 와 같은 것을 구현하기 전에 측정하고 테스트 하십시오. 많은 최신 운영 체제는 정기적 read으로 복잡성을 줄이면서 유사한 성능을 제공합니다 . 또한 Python의 mmap은 Windows 및 UNIX 메모리 맵에 대한 휴대용 인터페이스를 제공합니다.
Aron Ahmadia

1

아마도 파일 I / O 섹션에서 Cython을 사용하고이 부분을 C 코드로 변환 할 수 있습니까?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.