use strict; use warnings; use BerkeleyDB; use DB_File; use TokyoCabinet; use KyotoCabinet; unlink qw( /tmp/file.db /tmp/file.tch /tmp/file.kch ); unlink qw( /tmp/file.tct /tmp/file.kct ); # -- # my $ob = tie my %hash, 'BerkeleyDB::Hash', # -Filename => '/tmp/file.db', -Flags => DB_CREATE # or die "open error: $!"; # # my $ob = tie my %hash, 'BerkeleyDB::Btree', # -Filename => '/tmp/file.db', -Flags => DB_CREATE # or die "open error: $!"; # # my $ob = tie my %hash, 'DB_File', # '/tmp/file.db', O_RDWR|O_CREAT, 0644, $DB_HASH # or die "open error: $!"; # # my $ob = tie my %hash, 'DB_File', # '/tmp/file.db', O_RDWR|O_CREAT, 0644, $DB_BTREE # or die "open error: $!"; # # my $ob = tie my %hash, 'TokyoCabinet::HDB', '/tmp/file.tch', # TokyoCabinet::HDB::OWRITER | TokyoCabinet::HDB::OCREAT # or die "open error: $!"; # # my $ob = tie my %hash, 'TokyoCabinet::BDB', '/tmp/file.tcb', # TokyoCabinet::BDB::OWRITER | TokyoCabinet::BDB::OCREAT # or die "open error: $!"; # # my $ob = tie my %hash, 'KyotoCabinet::DB', '/tmp/file.kch', # KyotoCabinet::DB::OWRITER | KyotoCabinet::DB::OCREATE # or die "open error: $!"; # my $ob = tie my %hash, 'KyotoCabinet::DB', '/tmp/file.kct', KyotoCabinet::DB::OWRITER | KyotoCabinet::DB::OCREATE or die "open error: $!"; # -- # Tie interface : 23.875 seconds, 793 MiB - BerkeleyDB::Btree # 19.812 seconds, 793 MiB - DB_File $DB_BTREE # 19.208 seconds, 353 MiB - TokyoCabinet *.tcb # 17.232 seconds, 306 MiB - KyotoCabinet *.kct # # for ( 1 .. 10e6 ) { # $hash{$_} = "$_ some string..."; # } # # OO interface : 82.573 seconds, 639 MiB - BerkeleyDB::Hash # 73.383 seconds, 639 MiB - DB_File $DB_HASH # 87.695 seconds, 458 MiB - TokyoCabinet *.tch # 38.312 seconds, 464 MiB - KyotoCabinet *.kch # # 19.899 seconds, 793 MiB - BerkeleyDB::Btree # 14.340 seconds, 793 MiB - DB_File $DB_BTREE # 14.763 seconds, 353 MiB - TokyoCabinet *.tcb # 10.970 seconds, 306 MiB - KyotoCabinet *.kct # for ( 1 .. 10e6 ) { $ob->STORE($_ => "$_ some string..."); } #### $ tar xf $HOME/Downloads/kyotocabinet-1.2.76.tar.gz $ cd kyotocabinet-1.2.76 $ patch -p0 < $HOME/Downloads/patch-kccommon.h.diff $ patch -p0 < $HOME/Downloads/patch-configure.diff $ patch -p0 < $HOME/Downloads/patch-kcthread.cc $ ./configure --disable-lzo --disable-lzma $ make -j2 $ sudo make install #### $ tar xf $HOME/Downloads/kyotocabinet-perl-1.20.tar.gz $ cd kyotocabinet-perl-1.20 $ perl Makefile.PL $ sudo make install $ cd doc $ open index.html #### my $ob1 = tie my %h1, 'TokyoCabinet::ADB', '*'; # in-memory hash my $ob2 = tie my %h2, 'TokyoCabinet::ADB', '+'; # in-memory tree my $ob3 = tie my %h3, 'KyotoCabinet::DB', '*'; # in-memory hash my $ob4 = tie my %h4, 'KyotoCabinet::DB', '%'; # in-memory tree #### use strict; use warnings; use Time::HiRes 'time'; use TokyoCabinet; use KyotoCabinet; my %hash; my $ob2 = tie my %h2, 'TokyoCabinet::ADB', '+'; # in-memory tree my $ob4 = tie my %h4, 'KyotoCabinet::DB', '%'; # in-memory tree my $start = time; # Plain hash 1911 MiB, 10.182 seconds # for ( 1 .. 10e6 ) { # $hash{$_} = "$_ some string..."; # } # Tokyo Cabinet 627 MiB, 10.165 seconds # for ( 1 .. 10e6 ) { # $ob2->STORE($_ => "$_ some string..."); # } # Kyoto Cabinet 453 MiB, 10.062 seconds for ( 1 .. 10e6 ) { $ob4->STORE($_ => "$_ some string..."); } printf {*STDERR} "capture memory consumption in top: %0.03f\n", time - $start; 1 for ( 1 .. 2e8 ); #### use strict; use warnings; use List::Util 'shuffle'; use Time::HiRes 'time'; use TokyoCabinet; use KyotoCabinet; srand 0; my %hash; my $ob2 = tie my %h2, 'TokyoCabinet::ADB', '+'; # Tree my $ob4 = tie my %h4, 'KyotoCabinet::DB', '%#pccap=256m'; # Tree my $size = 5e6; my $start; my @keys = shuffle 1 .. $size; # plain hash 4.342 seconds # for ( 1 .. $size ) { # $hash{$_} = "$_ some string..."; # } # $start = time; # for ( @keys ) { # my $v = $hash{$_}; # } # TokyoCabinet 11.572 seconds '+' tree # TokyoCabinet 8.936 seconds '*' hash # for ( 1 .. $size ) { # $ob2->STORE($_ => "$_ some string..."); # } # $start = time; # for ( @keys ) { # my $v = $ob2->FETCH($_); # } # KyotoCabinet 11.991 seconds '%' tree # KyotoCabinet 6.087 seconds '*' hash for ( 1 .. $size ) { $ob4->STORE($_ => "$_ some string..."); } $start = time; for ( @keys ) { my $v = $ob4->FETCH($_); } printf "duration: %0.03f seconds\n", time - $start; #### "/tmp/file.kch#bnum=5000000" # hash "/tmp/file.kct#pccap=256m" # tree "*#bnum=5000000#capsiz=1024m" # in-memory hash "%#pccap=256m" # in-memory tree