대용량 파일에서 콘텐츠를 찾는 방법

대용량 파일에서 콘텐츠를 찾는 방법

큰 크기의 텍스트 파일이 있습니다. (약 2GB)

전화 할게A.txt

나는 알고 싶다.A.txt파일에 다음이 포함됨문장내가 원하는 (크기문장1Byte~500MB)

또한 만약에문장포함 된A.txt, 바이트에 포함된 위치를 알고 싶습니다.

답변1

#!/usr/bin/perl -w

use strict;

my $re=shift;
$re =~ s/[[:blank:]]+/\\s+/g;#/this comment only exists to fix SEs perl highlighting

my $blocksize = 100000;
my $filesize;

foreach my $file (@ARGV) {
  open(F,"<",$file) || die "couldn't open '$file': $!\n";

  $filesize=(stat($file))[7];

  my @matches=();
  for (my $i = 0; $i <= $filesize; $i+=$blocksize-(length($re))) {
    seek(F,$i,0);
    read F,$_,$blocksize;
    @matches=(m/$re/gmo);
    print join("\n",@matches), "\n" if (@matches);
    };
  close(F);
};

예를 들어 다른 이름으로 저장하고 puregyu.pl실행 가능하게 만들고 chmod +x puregyu.pl다음과 같이 실행합니다.

./puregyu.pl 'my sentence' a.txt

스크립트는 첫 번째 인수(검색 문자열 또는 패턴)를 취하고 [[:blank:]]모든 공백(예: 공백 및 탭)을 (공백, 탭, 줄 바꿈 및 폼피드를 포함한 모든 공백)로 변경하여 \s*여러 줄에 걸쳐 있는 경우에도 문장이 일치하도록 합니다. man perlrecharclass공백을 정의하는 방법에 대한 자세한 내용은 참고자료를 참조하세요.

나머지 인수는 검색할 파일 이름으로 처리됩니다.

전체 입력 파일을 한 번에 메모리에 로드하는 것을 방지하기 위해 스크립트는 입력 "청크"를 한 번에 하나씩 검색합니다. 입력 손실을 방지하기 위해 ) $i대신 명령문( )에서 사용하는 오프셋 변수를 증가시킵니다.read($blocksize - length($re)$blocksize

블록 크기를 1000000으로 설정하여 한 번에 100KiB를 읽습니다. 테스트할 만큼 큰 텍스트 파일이 없으므로 최상의 성능을 위해 이를 조정해야 할 수도 있습니다.

참고: 일치 항목의 바이트 위치를 얻는 것은 지금 할 수 있는 시간보다 더 많은 작업입니다. 다른 사람이 도움을 줄 수도 있습니다.


여러 줄로 구성된 "문장"을 일치시키려면 다음이 더 잘 작동합니다. 첫 번째 인수로 문자열 대신 파일 이름을 지정할 수 있습니다. 그런 다음 전체 파일을 삼켜 정규식으로 변환합니다.

#!/usr/bin/perl -w

use strict;

use File::Slurp;

my $re = read_file(shift,chomp=>1);
$re=~s/[[:blank:]]+/\\s+/gm;#/this comment only exists to fix SEs perl highlighting

my $blocksize = length($re)*5;
my $filesize;

foreach my $file (@ARGV) {
  open(F,"<",$file) || die "couldn't open '$file': $!\n";

  $filesize=(stat($file))[7];

  my @matches=();
  for (my $i = 0; $i <= $filesize; $i+=$blocksize-(length($re))) {
    seek(F,$i,0);
    read F,$_,$blocksize;
    @matches=(m/$re/gmo);
    print join("\n",@matches), "\n" if (@matches);
    };
  close(F);
};

예를 들어 다른 이름으로 저장하고 puregyu2.pl실행 가능하게 만들고 chmod +x puregyu2.pl다음과 같이 실행합니다.

./puregyu2.pl searchfile.txt a.txt

마지막으로 이러한 스크립트 중 어느 것도 완전히 테스트되지 않았습니다. 검색할 큰 텍스트 파일도 없고 검색할 큰 "문장"도 없습니다. 따라서 완전한 작업 코드가 아닌 가능한 올바른 방향에 대한 대략적인 포인터로 제공됩니다.

관련 정보