"wc -l"을 사용하면 파일을 처리하는 데 시간이 오래 걸립니다. 더 빠른 대안이 있습니까?

"wc -l"을 사용하면 파일을 처리하는 데 시간이 오래 걸립니다. 더 빠른 대안이 있습니까?

여러 개의 큰 파일 각각의 줄 수를 출력하는 스크립트를 작성하는 데 도움이 필요합니다. 시간이 오래 걸리기 때문에 일치하는 모든 파일의 마지막 줄 번호를 표시하는 명령을 wc -l사용하고 싶습니다.awkabd*2020-09-21*

  • ls -l abd*2020-09-21*22개의 긴(대형) 파일 표시 중
  • wc -l각 파일에 대한 결과를 찾아야 합니다 .
  • 현재 내가 사용하고 있는
    wc -l abd*2020-09-21.txt > CCNC_UNIX_COUNTS.txt
    
    그러나 이것은 매우 시간이 많이 걸립니다. 개선하는 데 도움이 필요합니다.

나는 노력했다

sed -n '$='

이제 matchinv 모든 파일에 대해 루프에서 작동 abd*2020-09-21.txt하고 결과를 파일로 출력해야 합니다.CCNC_UNIX_COUNTS

답변1

텍스트 파일은 인덱스나 메타데이터가 없는 바이트 스트림일 뿐이며 각 줄 뒤에 개행 문자가 있는 연속된 줄입니다. 파일 전체를 읽는 것 외에는 줄 수를 계산하는 다른 방법이 없습니다. wc -l이는 개행 바이트를 읽는 일괄 스캔 외에는 다른 작업을 수행할 필요가 없기 때문에 효율적으로 수행할 수 있습니다. 반면에 awk살펴볼 다른 도구도 많이 있습니다.콘텐츠필드 분할 수행과 같은 라인에서는 실행을 위해 제공한 코드를 해석하고 실행해야 합니다. wc -l이보다 더 빠른 스크립트 언어는 없습니다 .

반면에 메타데이터 누락이 일반적으로 문제인 경우 다른 파일 형식(예: SQLite 데이터베이스)을 사용하는 것이 옵션일 수 있습니다. 물론 이렇게 하면 일반적인 텍스트 처리 도구를 사용하여 데이터를 작업할 수 없지만 임의 액세스가 더 쉬워질 수 있습니다. 또는 모든 행을 유지하도록 데이터 경로를 수정할 수 있는 경우일정한 길이, 임의 액세스 및 행 계산은 간단합니다(그러나 중간에 행을 삽입하거나 삭제하지는 않음).

답변2

개수가 정확할 필요가 없으면 파일 끝에서 샘플링하여 평균을 구하고 매우 빠른 통계로 얻은 파일의 바이트 길이를 기준으로 줄 수를 계산하여 길이를 추정할 수 있습니다. .

예를 들어, /tmp에 100MB 파일이 있습니다. 사용:

time wc -l /tmp/100-mb.txt

생산하다:

1777700 /tmp/100-mb.txt
real    0m0.075s

추정을 위해 Perl 코드를 사용하십시오.

time ./esmele /tmp/100-mb.txt

생산하다:

1763385
real    0m0.012s

정확도는 99% 이상이며 속도는 6배 향상됩니다. Perl 변환이 생략되므로 C 또는 유사한 코드가 더 빠를 수 있습니다.

시스템에서 실행:

OS, ker|rel, machine: Linux, 3.16.0-10-amd64, x86_64
Distribution        : Debian 8.11 (jessie) 
perl 5.20.2

행운을 빕니다... 건배, drl

답변3

하드웨어에 따라 다음을 시도해 볼 수 있습니다.

expr-fi/fastlwc: SIMD 강화 단어 카운터 - GitHub

멀티스레드 버전도 있습니다.

대용량 파일로 테스트하지는 않았지만 작동하고빠르게.

SIMD를 통한 단어 계산 알고리즘은 readme 파일에 설명되어 있습니다. 기본 아이디어는 다음과 같습니다.

Just a sample (multiple   spaces).
1111010111111011111111100011111111             =[1]
0111101011111101111111110001111111 SHIFT [1]   =[2]
1000010100000010000000001110000000 NOT [2]     =[3]
1000010100000010000000000010000000 [1] AND [3]

fastwc단어와 줄은 계산되지만 멀티바이트 문자는 계산되지 않습니다 .

관련 정보