로그 파일 처리 간 성능 비교 [닫기]

로그 파일 처리 간 성능 비교 [닫기]

저는 약 10GB 크기의 대용량 로그 파일을 작업 중이며 패턴 일치를 위해 zgrep을 사용하고 있습니다. 그런데 이제 유스케이스가 좀 복잡해졌고, zgrep을 사용할 수 없어서 로직을 awk로 변경했는데, 이로 인해 성능 문제가 많이 발생했습니다.

Time
using zgrep ~1.5 minutes
using awk ~11 minutes
using python ~ 13 minutes

가능한 해결책을 찾기 위해 Google에서 검색을 시도했지만 찾을 수 없습니다. .gz 파일을 효율적으로 구문 분석하는 방법은 무엇입니까?

입력 예

String1:"Hello"
String2:"World"
String3:"Question"
End
String1:"HelloAgain"
String5:"Answer"
End
String1:"NewEntry"
String2:"Foo"
String5:"NewFile"
End

예제 출력

Hello World
HelloAgain
NewEntry Foo

이게 원래 질문이에요셸을 사용하여 특정 패턴 반복.

답변1

수행 중인 작업이 개별 라인의 패턴 일치뿐이라면 속도는 거의 불가능합니다 grep(또는 zgrep기본적으로 더 멋진 구현일 뿐입니다). zcat | grep이것이 grep유일한 목적이며 수십 년 동안 해당 작업에 최적화되었습니다.

grep이것이 할 수 있는 유일한 일입니다 . 그것이 너무 빠른 이유 중 하나입니다.

그 이상을 수행해야 하는 경우(예: 행이 특정 패턴과 일치하는 경우 해당 행의 일부를 출력하고 선택적으로 첫 번째 조건이 true이고 두 번째 행이 다른 행의 다른 패턴 부분과 일치하는 경우 - 작업에 표시된 대로) ), 그렇다면 이것은 훨씬 더 복잡하고 우리의 grep능력을 넘어서는 것입니다.

이러한 복잡성 수준은 본질적으로 단순한 패턴 일치보다 느립니다. 이것은 불가피합니다. 프로그램에는 더 많은 작업이 필요하며 항상 더 많은 작업이 필요합니다.

그럼에도 불구하고 일부 언어는 특정 작업에서 다른 언어보다 더 빠르며, 적어도 중요하게는 작업을 구현하기 위해 선택한 알고리즘(예: 작업 수행 방법)이 성능에 큰 영향을 미칠 수 있습니다.

중소형 파일로 작업할 때는 성능 차이가 미미하고 눈에 띄지도 않을 수도 있지만, 대용량 파일로 작업할 때(또는 수천 번 반복적으로 실행할 때) 작은 성능 차이라도 합산되어 성능에 매우 큰 영향을 미칠 수 있습니다. 질주 . 시간.

awk예를 들어 perl원래 쉘 스크립트는 sh에 비해 훨씬 느립니다 python(몇 분이 아닌 몇 시간 이상). 이는 sh가 이러한 작업을 잘 수행하지 못하기 때문입니다. sh에서는 파일에서 입력 데이터를 반복하는 것이 특히 느립니다. 셸의 주요 목적은 자체적으로 복잡한 텍스트 처리가 아닌 대화형 및/또는 스크립트 작업 제어를 위한 것입니다( bash그런 점에서 zsh기존보다 더 강력 하지만 shor와 같은 전용 텍스트 처리 언어는 항상 더 좋고 빠릅니다).awkperl

간단히 말해서:

  • 작업에 가장 적합한 도구를 선택하세요
  • 훌륭하고 빠른 알고리즘을 구현하십시오.

그건 그렇고, "최고"는 작업에 가장 적합한 도구일 뿐만 아니라, 그 중 일부는 당신이 가장 잘 아는 도구와 해당 언어로 필요한 것을 작성하는 것이 얼마나 쉬운 지입니다. 예를 들어, 많은 작업에 대해 awk거의 perl유사한 성능( awk보통 조금 더 빠르지만 perl더 많은 내장 함수와 생각할 수 있는 거의 모든 작업을 수행할 수 있는 거대한 코드 기반이 있음)CPAN). Perl보다 awk를 더 잘 알고 있다면 awk를 사용하십시오. 그 반대.

나는 간단한 작업에는 awk를 사용하고 더 복잡한 작업에는 Perl을 사용하는 경향이 있습니다. 때때로 나는 Python을 사용하지만 내가 작성한 대부분의 내용은 Python보다 Perl에 더 적합하며 Python을 아는 것보다 Perl을 훨씬 더 잘 알고 있습니다.

관련 정보