거대한 파일을위한 'sort -u'의 확장 성


23

'sort -u'의 합리적인 확장 성 한계는 무엇입니까? ( "라인 길이", "라인 수", "총 파일 크기"의 차원)?

"라인 수"차원에서이를 초과하는 파일에 대한 Unix 대안은 무엇입니까? (물론 쉽게 구현할 수는 있지만 표준 Linux 명령으로 수행 할 수있는 작업이 있는지 궁금합니다.)


이진 검색을 원하거나 방법을 알고 싶은 사람들을 위해 : unix.stackexchange.com/q/247508/9689
Grzegorz Wierzowiecki

2
uniq전에 sort -u도움 이되는 상황 이 있습니다. ASCII 데이터가 BTW, LC_ALL=C sortGNU에게 속도를 sort엄청 많이합니다 ( 이 답변 )
월터 Tross

답변:


39

sortLinux에서 찾을 수 있음은에서 온다 로 coreutils 패키지 구현하는 외부 R-방법 병합 . 데이터를 메모리에서 처리 할 수있는 청크로 분할하고 디스크에 저장 한 다음 병합합니다. 기계에 프로세서가 있으면 청크가 병렬로 수행됩니다.

따라서 제한 sort이 있으면 병합해야하는 임시 파일을 결과와 함께 저장하는 데 사용할 수있는 디스크 여유 공간 이됩니다.


3
GNU 정렬은 임시 파일을 압축하여 더 많이 압축 할 수 있으며 느린 디스크에서는 성능을 향상시킬 수 있습니다.
Stéphane Chazelas

1
@ StéphaneChazelas 업데이트 해 주셔서 감사합니다. 공간 최적화로 하나가 완전히 병합 될 때 (소스가 이미 부분적으로 정렬 된 경우 쉽게 발생할 수 있음) 청크 파일을 제거하기에 충분히 똑똑한 지 궁금합니다. 나는 요즘 소스 코드에 뛰어들 시간이 없다 :-(
Anthon

3
메모리 외에도 병합 단계에 적용되는 또 다른 제한이 있습니다. 동시에 열 수있는 파일 수입니다. 이것은 일반적으로 운영 체제에 의해 부과 된 제한입니다. GNU 정렬은 한 번에 열 수있는 파일 수를 재귀 적으로 병합하여 이에 대응합니다!
Diomidis Spinellis

@ StéphaneChazelas 매우 큰 파일을 정렬하기 위해 특별히 도구를 디자인하는 경우 줄을 원본 파일의 색인으로 저장합니다. GNU 정렬이 이것을 수행합니까, 아니면 단순히 일반적인 압축 알고리즘을 사용합니까?
Random832

3
@ Random832 그리고 그것은 파일 자체를 덮어 쓸 수 있도록되어 있습니다 ( sort -o file file)
Stéphane Chazelas

1

공급 업체별 구현을 말할 수는 없지만 UNIX sort구현시 큰 파일을 작은 파일로 분할하고 이러한 파일을 정렬 한 다음 정렬 된 작은 파일을 집계 된 정렬 된 출력으로 결합합니다.

유일한 제한 사항은 중간에 의해 생성 된 작은 파일의 디스크 공간 sort이지만 환경 변수를 설정하여 임의의 디렉토리로 파일을 리디렉션 할 수 있습니다 TMPDIR.


3
정확히 무엇을 UNIX 정렬 구현이라고 합니까? Unix 버전 3의 원본입니까? 맨 페이지에는 128KiB보다 큰 파일을 정렬 할 수 없다고 나와 있습니다.
Stéphane Chazelas

유닉스 버전 3은 무엇을 이해합니까? 1973 년판? 원래 UNIX 정렬 구현은 수년에 걸쳐 향상되었으며 IIRC, Solaris 버전은 GNU 버전보다 훨씬 빠릅니다. 물론 25 년 전 정렬은 멀티 바이트 문자를 이해하도록 향상되었으며 USENET 토론에서 기억하는 것은 이것이 Solaris에서 효율적으로 수행되었다는 것입니다. BTW : 큰 파일 인식으로 man largefile나열 sort합니다.
schily

2
실제로 오라클 공급 업체별 버전에 대해 이야기하고 sort있습니까? 아니면 AT & T Unix 버전의 파생물이 있습니까? 아니면 유닉스 인증 버전 sort( sortOS / X의 GNU와 같은 )이 있습니까?
Stéphane Chazelas

sort멀티 바이트 문자에 대한 최신 구현 의 품질 은 다양 할 수 있습니다. sort분할 중간 파일 을 사용 한다는 사실 은 원래 코드를 기반으로하는 모든 UNIX 구현에 공통적입니다. BTW : Solaris 버전은 "OpenSolaris"로 OSS입니다. sourceforge.net/p/schillix-on/schillix-on/ci/default/tree/usr/…를
schily

25 년 전, UTF-8은 아직 발명되지 않았습니까? UTF-8 로켈에 대한 지원이 Solaris 7 ( 1 , 2 ) 에 추가되었습니다 . 다른 멀티 바이트 문자 집합을 참조하고 있습니까?
Stéphane Chazelas

1

https://blog.mafr.de/2010/05/23/sorting-large-files//unix//a/88704/9689 기반으로 :

split -n l/20 input input-
for inpf in input-* ; do
    sort --parallel="$(nproc --all)" "${inpf}" > sorted-"{$inpf}"
done
sort -m sorted-input-* > sorted-input

최신 정보:

위의 답변에서 우리는 sort이미 언급 한 스 니펫 즉 외부 R-Way 병합을 수행 합니다. 따라서 모든 실행 후 :

sort --parallel="$(nproc --all)" -u input > output

충분해야합니다.

한계에 대한 나의 현재 가정 (코드를 확인하지 않고)은 다음과 같습니다.

  • 최대 라인 길이는 실제 메모리 양에 의해 제한됩니다. 적어도 두 개를 메모리에 맞출 필요
  • 줄의 양-나는 모른다
  • 파일 크기-물론 파일 시스템
  • 운영 체제에 따라 동시에 열린 파일 수 -Diomidis Spinellis 가 이것을 지적 해 주셔서 감사 합니다!

(이 답변은 커뮤니티 위키 로 표시되어 있습니다 -개선하도록 장려됩니다! :))


2
GNU sort는 기본적으로 병렬로 정렬합니다 (링크 한 페이지 이후 2010 년 이후) . 최적 --parallel의 스레드를 sort결정하는 대신 동시 스레드 수를 줄여야합니다 . 정렬은 이미보다 효율적인 방식으로 내부에서 분할 및 병합을 수행합니다. 여분의 분할을 수행하면 도움이 될 것입니다.
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.