2016-08-10 3 views
6

현재 500GB 텍스트 파일의 UNIX 정렬 (Windows 컴퓨터에서 GitBash를 통해)을 수행하고 있습니다. 주 디스크의 공간이 부족하여 -T 옵션을 사용하여 전체 파일을 수용 할 수있는 충분한 공간이있는 디스크로 임시 파일을 보냅니다. 문제는 디스크 공간을보고 있었고 임시 파일이 원래 파일이 이미 초과 된 것입니다. 얼마나 더 나아질 지 모르겠지만 임시 파일에 필요한 공간을 예측할 수있는 규칙이 있는지 궁금합니다.유닉스 정렬에 필요한 디스크 공간

+2

유닉스 정렬이 GNU 정렬과 비슷하게 작동하면, 초기 패스는 램 크기에 기초한 임시 파일을 만든다. 메모리에서 정렬에 사용할 수있는 1GB의 RAM이 있다고 가정하면 500 개의 1GB 파일을 생성 한 다음 해당 파일에 대해 16 가지 방법의 병합을 반복합니다. 또한 각 병합 후에 파일을 삭제한다고 가정하면 516GB의 공간이 필요하며 각 파일은 클러스터 (파일 할당) 크기 경계로 반올림됩니다. 마지막 병합에서 필요한 디스크 공간은 파일 크기의 두 배가됩니다 (클러스터 결합에 반올림 됨). 따라서 1,000GB가 조금 넘습니다. – rcgldr

+0

쥐! 좀 더 많은 스토리지에 투자해야 할 것 같습니다. – Thoughtcraft

+0

임시 폴더에서도 마지막으로 병합됩니까? 하나의 디스크에 두 개의 완전한 파일 복사본이있는 것을 피하기 위해 출력을 temp와 다른 위치로 지정했습니다. – Thoughtcraft

답변

0

this unix.SE answer에 설명 된대로 수동으로 배치 할 수 있습니다.

콘텐츠를 정렬 할 수있을만큼 작은 조각으로 나눌 매우 기본적인 쿼리를 찾습니다. 예를 들어 단어 파일 인 경우 grep ^a …, grep ^b … 등과 같은 검색어를 만들 수 있습니다. 일부 항목은 다른 항목보다 세분화가 필요할 수 있습니다. 이 GZIP의 기본 gzip -6 거의 빨리 때문에 내가 xz -0을 사용하고

#!/bin/bash 
for char1 in other {0..9} {a..z}; do 
    out="/tmp/sort.$char1.xz" 
    echo "Extracting lines starting with '$char1'" 
    if [ "$char1" = "other" ]; then char1='[^a-z0-9]'; fi 
    grep -i "^$char1" *.txt |xz -c0 > "$out" 
    unxz -c "$out" |sort -u >> output.txt || exit 1 
    rm "$out" 
done 
echo "It worked" 

아직이 공간을 절약에서 훨씬 더 나은 :

당신은 스크립트처럼 할 수 있습니다. sort -u의 종료 값을 보존하기 위해 최종 출력에서 ​​생략했지만 대신 크기 확인 (iirc, 정렬은 0 출력으로 실패 함)을 사용하고 sort -u |xz -c0 >> output.txt.xz을 사용할 수 있습니다. xz (및 gzip) 컨테이너를 사용하면 아카이브를 연결할 수 있습니다 (전에도 written about that했습니다.) 각 그렙 실행의 출력이 이미 (0 등, a 이전 인 1 이전 인) 분류되기 때문에 최종 조립이 sort (주, "기타"를 통해 실행하지 않도록

이 작품 일부 영숫자가 숫자 앞에오고 다른 문자는 숫자와 문자 사이에 있고 다른 문자는 여전히 문자 뒤에 있기 때문에 grep의 -i 플래그를 제거하고 추가적으로 대소 문자를 구분하기 위해 {A..Z}을 반복 할 수 있습니다. 각 개별 반복은 분명히 정렬되어야하지만 잘하면 관리 할 수 ​​있어야합니다.

모든 반복을 완료하고 "작동 했음"이라고 말하면 프로그램이 종료 된 후 마지막 반복에 대해 더 개별적인 배치로 스크립트를 편집 할 수 있습니다. 이전 iterations가 모두 output.txt에 성공적으로 저장되었으므로 이전 반복을 모두 제거하십시오.