2012-09-27 3 views
0

파일이 메모리에 맞지 않습니다. 100GB 이상이고 줄 번호로 특정 줄에 액세스하려고합니다. 내가 도달 할 때까지 줄 단위로 계산하고 싶지는 않습니다. 나는 다음과 같은 방법을 사용하여 인덱스를 구축 할 때매우 큰 파일에서 특정 라인을 라인 번호별로 읽음

내가

http://docstore.mik.ua/orelly/perl/cookbook/ch08_09.htm을 읽고, 줄 반환 특정 지점까지 작동합니다. 행 번호가 매우 크면 반환되는 행은 동일합니다. 파일의 특정 줄로 이동하면 같은 줄이 반환됩니다. 1에서 350000 사이의 행 번호에서 작동하는 것으로 보입니다 (약).

# usage: build_index(*DATA_HANDLE, *INDEX_HANDLE) 
    sub build_index { 
     my $data_file = shift; 
     my $index_file = shift; 
     my $offset  = 0; 

     while (<$data_file>) { 
      print $index_file pack("N", $offset); 
      $offset = tell($data_file); 
     } 
    } 

    # usage: line_with_index(*DATA_HANDLE, *INDEX_HANDLE, $LINE_NUMBER) 
    # returns line or undef if LINE_NUMBER was out of range 
    sub line_with_index { 
     my $data_file = shift; 
     my $index_file = shift; 
     my $line_number = shift; 

     my $size;    # size of an index entry 
     my $i_offset;   # offset into the index of the entry 
     my $entry;    # index entry 
     my $d_offset;   # offset into the data file 

     $size = length(pack("N", 0)); 
     $i_offset = $size * ($line_number-1); 
     seek($index_file, $i_offset, 0) or return; 
     read($index_file, $entry, $size); 
     $d_offset = unpack("N", $entry); 
     seek($data_file, $d_offset, 0); 
     return scalar(<$data_file>); 
    } 

나는 또한 DB_file 방법을 사용하여 시도했다, 그러나 넥타이를 할 수있는 시간이 오래 걸릴 것으로 보인다. 또한 "DB_RECNO 액세스 방법은 배열 요소를 파일 하나의 배열 요소에 묶습니다."라는 의미를 실제로 이해하지 못합니다. Tie가 파일을 배열로 올바르게 읽지 않습니까?

+0

고정 길이 또는 가변 길이 라인? –

+0

_ 도달 할 때까지 줄 단위로 계산하고 싶지 않습니다. - 길이가 가변적 인 줄이면 선택이 없습니다. –

+0

가변 길이 – user1645240

답변

4

pack N은 32 비트 정수를 생성합니다. 최대 32 비트 정수는 4GB이므로 100GB 크기의 파일에 인덱스를 저장하면 작동하지 않습니다.

일부 빌드는 64 비트 정수를 사용합니다. 이 경우 j을 사용할 수 있습니다.

일부 빌드는 32 비트 정수를 사용합니다. tell은 이러한 파일에 부동 소수점 숫자를 반환하므로 최대 8,388,608GB의 파일을 무손실로 인덱싱 할 수 있습니다. 이 경우 F을 사용해야합니다. 로 보일 것이다

휴대용 코드는 다음과 같습니다

use Config qw(%Config); 
my $off_t = $Config{lseeksize} > $Config{ivsize} ? 'F' : 'j'; 

... 
print $index_file pack($off_t, $offset); 
... 

참고 : 나는 색인 파일을 믿고있어 단지 같은 정수와 함께 하나 이상을 내장 (또는 같은 펄에 의해 사용된다 크기, 탐색 크기 및 기계 엔디안). 그 가정이 당신을지지하지 않는다면 알려주세요.

+0

Q는 지원되지 않습니다. 오류 : 잘못된 유형 'Q'팩에 buildIndex.pl 라인 21, 줄 1입니다. – user1645240

+0

내 대답이 업데이트되었습니다. – ikegami

+0

예 인덱스 파일은이 파일을 만든 Perl과 만 사용해야합니다. 필자는 이식성있는 코드 나 그 코드로 무엇을해야 하는지를 정말로 이해하지 못합니다. 나는 펄에 처음 온 사람이다. "N"을 모두 "j"또는 "F"로 변경합니까? – user1645240

관련 문제