2011-04-20 6 views
1

각각 약 10-15GB 압축 된 각각 약 30 개의 gzip-ed 텍스트 파일을 병합해야합니다. 각 파일에는 여러 줄 레코드가 들어 있으며 각 레코드는 동일한 키순으로 정렬됩니다. 파일은 NFS 공유에 있으며 여러 노드에서 액세스 할 수 있으며 각 노드에는 자체 파일 시스템 /tmp이 있습니다. 그것에 대해 가장 빠른 방법은 무엇입니까?정렬 된 파일을 효율적으로 병합

몇 가지 가능한 솔루션 :

A.이 sort -m에 모든 둡니다. 이를 수행하려면 각 입력 파일을 awk/sed/grep으로 전달하여 각 레코드를 줄 바꿈하고 sort으로 이해할 수있는 키를 추출해야합니다. 그래서

sort -m -k [...] <(preprocess file1) [...] <(preprocess filen) | postprocess

B. 파이썬의 heapq.merge로 봐 같은 것을 얻을 것입니다.

C. 이렇게하려면 내 자신의 C 코드를 작성하십시오. 나는 위의 모든 등 실제 RAM의 병합을 수행 하나,

옵션을 소량의 파일을 병합, 각 입력 파일의 출력을 OMP 스레드를 만들고, 수 :

D 한 번에 토너먼트에서 몇 개의 파일을 병합하십시오.

E. 여러 노드를 사용하여 노드간에 중간 결과를 복사합니다.

무엇을 권하고 싶습니까? 저는 2 차 스토리지 효율성에 대한 많은 경험이 없기 때문에 이들 중 어느 것이 수행되는지 예측하기가 어렵습니다. 당신이 heapq.merge를 포함하는 솔루션의 B 갈 경우

+0

문제의 근원을 어디에서 더 가깝게 공격했는지 생각해 봤습니까? 예 : 텍스트 파일이 레코드 지향형 대신 여러 줄로 작성된 경우 사전 처리없이 병합 정렬을 수행 할 수 있습니다. – Jens

답변

2

, 당신은 파이썬 3.5 docs.python.org, bugs.python.orggithub.com에 따라) (heapq.merge하는 key 매개 변수를 추가 할 것을 알고 기뻐하실 겁니다. 이것은 당신의 문제에 대한 훌륭한 해결책이 될 것입니다.

관련 문제