1.4TB 파일을 정렬하려고 합니다(중복 행을 제거하는 것이 좋음).
개별 청크를 분할하고 정렬하는 것은 문제가 되지 않지만, 다시 조립하는 것은 어려운 일입니다. 나는 매뉴얼 페이지에서 "sort -m"(FreeBSD 11 아래)이 간단한 병합을 수행하여 완벽하게 정렬된 집계된 출력을 생성하고 선택적으로 -u 옵션을 사용하여 중복을 억제할 것이라고 예상했습니다.
그러나 잠시 동안 실행한 후에는 입력을 정상적으로 정렬하는 것처럼 (지금까지) 수백 개의 임시 파일이 생성되었음을 발견했습니다.
동일한 데이터를 3번 저장하기에는 디스크 공간이 부족합니다. 임시 디스크 공간 없이 정렬된 파일을 간단히 병합할 수 있는 유틸리티가 있습니까?
===결과===
결국 "표준" 정렬을 사용하게 되었습니다. 처리에는 수백 개의 임시 파일 생성을 포함하여 약 50시간의 높은 CPU 및 디스크 로드가 필요했습니다. 이는 입력이 이미 완벽하게 정렬되어 있다는 사실에도 불구하고 발생합니다. 미리 정렬된 파일을 깔끔하게 병합할 수 있는 간단한 유틸리티가 있는지 알고 싶습니다.
답변1
오늘 다른 데이터로 더 많은 실험을 한 후에 문제를 발견했을 수도 있다고 생각합니다. 기본적으로 sort(BSD)는 한 번에 16개의 파일만 엽니다(맨 페이지에서는 여기에 입력 파일과 임시 파일이 포함되어 있음을 암시하는 것 같습니다). .
--batch-size= 스위치를 사용하면 이 수를 늘릴 수 있습니다.
100MB 크기의 미리 정렬된 파일 사용:
sort -u -m <...15개 파일 이름...>
- 즉시 출력
sort -u -m <...16개 파일 이름...>
- 임시 파일의 중간 사용을 포함하여 최소한 두 개의 개별 청크로 입력을 처리하는 것으로 보입니다.
유형--배치 크기=20-u -m <...16개 파일 이름...>
- 즉시 출력
원시 데이터에서는 이것을 테스트할 수 없지만 이것이 문제라고 확신합니다.
이것이 동일한 문제를 가진 누군가에게 도움이 되기를 바랍니다.
답변2
귀하의 요구 사항(따라서 백업 메모리/스토리지/클라우드)으로 인해 속도가 매우 느려지지만 자체 파일 시스템 드라이버를 작성하면 가능합니다. 하지만 그렇게 할 시간/기술이 있다면 $37 2TB 드라이브를 임대/구매/판매/반납하고 사용하는 것이 더 빠르고/저렴할 것입니다.
https://en.m.wikipedia.org/wiki/External_sorting
파일이 압축 가능한 경우 솔루션은 zram 및/또는 7z/fs 압축일 수 있습니다. 두 번째 복사본을 위한 공간을 만들 수 있습니다.
https://en.m.wikipedia.org/wiki/Zram
https://en.m.wikipedia.org/wiki/Category:압축 파일 시스템
입력을 제거하지 않고 출력할 공간이 있고 입력이 미리 정렬되어 있는 경우에는 문제가 되지 않습니다.
답변3
매우 큰 슬라이더 퍼즐을 풀다가 비슷한 문제에 부딪혔습니다. 현재 약 100개의 정렬된 파일을 병합해야 하며, 각 파일에는 약 6천만 개의 위치가 포함되어 있으며 15GB를 차지합니다. 파일은 중복되지 않고 개별적으로 정렬되지만, 서로 다른 파일이 동일한 기록을 가질 수 있습니다.
나는 기본적으로 모든 파일을 열고 한 번에 각 파일에서 하나의 레코드를 읽는 유틸리티를 C++로 작성했습니다. 각 단계에서 가장 오래된 알파벳순 레코드(SHELL 정렬 사용)를 찾아 해당 레코드를 씁니다. 이 파일과 동일한 레코드가 있는 다른 파일에서 다음 레코드를 읽습니다. 답을 얻기 위해 새로운 MAC 노트북에서 5시간 동안 실행했습니다.
메모리 요구 사항은 크지 않으며 각 파일은 한 번만 읽혀집니다. 이는 한 번에 두 개의 파일로 제한되고 파일을 여러 번 읽는 통신 솔루션보다 훨씬 빠르게 실행됩니다.
이 프로그램은 두 대의 컴퓨터, 즉 프로그램이 원래 개발된 MAC 랩톱과 MAC M1에서 컴파일되어 실행되었습니다. 지금까지 실행된 가장 큰 작업에는 676개의 파일이 있었고 각 파일의 크기는 약 6천만 개, 즉 크기가 1.5GB였으며 실행하는 데 10시간이 조금 넘게 걸렸습니다.
답변4
내 생각에 당신이 찾고 있는 것은 입니다 comm
. 얼마나 많은 메모리나 임시 공간을 사용하는지 잘 모르겠지만 입력 파일이 정렬되어야 한다는 요구 사항과 이러한 유틸리티를 작성하는 사람들이 바보가 아니라는 사실을 고려하면 정말 효율적이라고 확신합니다.
uniq
입력이 정렬되어 있다고 가정하므로 중복 제거를 사용할 수 있습니다 .