私は、ディスク上のキー/値データベースを示唆しています。 Perlのtie functionのために、彼らは通常、メモリ内のハッシュと同一に使用することができます。あなたのハッシュが非常に大きい場合、Perlのハッシュよりも読み込み/書き込みの方が速く、ディスクへの保存/読み込みを自動的にサポートします。
BerkeleyDBは古いのお気に入りです:データベースへ
use BerkeleyDB;
# Make %db an on-disk database stored in database.dbm. Create file if needed
tie my %db, 'BerkeleyDB::Hash', -Filename => "database.dbm", -Flags => DB_CREATE
or die "Couldn't tie database: $BerkeleyDB::Error";
$db{foo} = 1; # get value
print $db{foo}, "\n"; # set value
for my $key (keys %db) {
print "$key -> $db{$key}\n"; # iterate values
}
%db =(); # wipe
変更は自動的にディスクに保存され、スクリプトの複数の呼び出しを通じて持続します。
オプションについてはperldocをチェックしますが、最も重要なのは、次のとおりです。
# Increase memory allocation for database (increases performance), e.g. 640 MB
tie my %db, 'BerkeleyDB::Hash', -Filename => $filename, -CacheSize => 640*1024*1024;
# Open database in readonly mode
tie my %db, 'BerkeleyDB::Hash', -Filename => $filename, -Flags => DB_RDONLY;
これは結局Perlのである(より複雑ですが、はるかに高速データベースライブラリがTokyo Cabinetだろう、と他の多くのオプションがもちろんあります。 ..)
出典
2012-02-22 18:44:34
rjh
'perlの-e '1..100_000_000ため++ $ hを{$ _}は、''私のために7秒かかります。それは実際にはかなり速いです。私はあなたのメモリが使い果たされているので、あなたのコードが遅いかもしれないと思うので、仮想メモリの使用に頼っています。最適なソリューションはおそらく、データセット全体をメモリにロードする必要がないソリューション(データベースソリューションなど)です。 – ikegami
あなたは右にStorableモジュールを使用している間、私は、メモリの制限を打っています考え出しています。生産データセットには500行あります。私はDBベースのソリューションに行く必要があると思う。 – Abhi