принимаются в том числе и ответы «не использовать перл для программы длиннее 20 строчек», но вообще-то хочется узнать:
1. чего я не знаю в перле, раз такая очевидная конструкция у меня глючит
2. как это пофиксить побыстрому (куда-то передать ссылку вместо хэша и т.п.)... не применять же препроцессор, елки-палки?
итак, создадим bdb на 600МБ (это слегка тормозит, но это нормально)
#!/usr/bin/perl -W
use DB_File;
my %result;
tie %result, 'DB_File', 'test.bdb', O_RDWR|O_CREAT, 0666, $DB_BTREE ;
for(my $i=1; $i<12345678; $i++ )
{
warn( $i ) if $i%100000 eq 0;
$result{$i} = 12345678 - $i;
}
далее читаем 1 запись из этого файла:
#!/usr/bin/perl -W
use DB_File;
use strict;
sub hash_from_file($)
{
my ($file) = @_;
my %result;
tie %result, 'DB_File', $file, O_RDWR|O_CREAT, 0666, $DB_BTREE ;
return %result;
}
my %result;
if( exists($ARGV[0]) )
{
print "hash_from_file\n";
%result = hash_from_file('test.bdb');
}
else
{
# делаем то же, что hash_from_file, только без вызова этой функции
tie %result, 'DB_File', 'test.bdb', O_RDWR|O_CREAT, 0666, $DB_BTREE ;
}
print "starting\n";
print $result{'12344321'}."\n";
тут 2 варианта вызова скрипта:
1. если вызвать без аргументов, то читает мгновенно
2. но если вызвать с аргументом, то жрет много памяти (у меня на 32бит дошло до 2ГБ и далее стало свопиться) и цпу 100% одного ядра (причем в меньшем по размеру примере через примерно минуту такого поведения оно таки рожает правильный ответ)
почему, елки-палки?