파일이 메모리에 맞지 않습니다. 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가 파일을 배열로 올바르게 읽지 않습니까?
고정 길이 또는 가변 길이 라인? –
_ 도달 할 때까지 줄 단위로 계산하고 싶지 않습니다. - 길이가 가변적 인 줄이면 선택이 없습니다. –
가변 길이 – user1645240