저는 약 1,700,000 개의 키가있는 해시를 만드는 Perl 프로젝트를 진행하고 있습니다. 이것은 너무 커서 메모리에 저장할 수 없습니다 (노트북의 메모리는 약 1 천만 개의 키만 보유 할 것입니다). 솔루션은 디스크에 데이터를 저장하는 것이지만 실제로 이것을 실행하는 데 문제가 있습니다. 여기에 내가 무엇을 시도했다입니다 :Perl : 디스크에 거대한 해시를 저장하는 데 문제가 있습니까?
DB_File
use strict;
use DB_File;
my $libfile = shift;
my %library;
tie %library, "DB_File", "$libfile";
for (my $a = 1; $a < 17000000; a++) {
# Some code to generate key and value #
$library{$key} = $value;
}
이 나에게 세그먼트 오류 제공 : 루프를 11 일부 길, 내가 이해하지 못하는 이유를.
버클리는
use strict;
use BerkeleyDB;
my $libfile = shift;
my $library = new BerkeleyDB::Hash
-Filename => $libfile,
-Flags => DB_CREATE;
for (my $a = 1; $a < 17000000; a++) {
# Some code to generate key and value #
$library->db_put($key, $value);
}
이 첫 번째 1500 만 키에 대해 잘 작동하는 것 같다, 그러나 아래로 크게 둔화 마침내 완전히 루프의 끝 부분에서 정지. 나는 이것이 기억 문제라고 생각하지 않는다. 루프를 네 조각으로 나누고 네 개의 개별 프로그램에 넣은 다음 순차적으로 실행하면 (처음에는 데이터베이스에 4 백만 개의 레코드가 추가됩니다) 처음 세 개는 성공적으로 완료되지만 데이터베이스가 약 15 개가 될 때 네 번째 핸들이 중단됩니다 백만 개의 열쇠. 그래서 아마도 BerkeleyDB 만 해시로 ~ 1500 만 건의 키를 처리 할 수있는 것처럼 보입니다. ???
DBM : 예비 시험에서
use strict;
use DBM::Deep;
my $libfile = shift;
my $library = new DBM::Deep $libfile;
for (my $a = 1; $a < 17000000; a++) {
# Some code to generate key and value #
$library->put($key => $value);
}
깊은이 확인을 작동하는 것 같다,하지만 정말 느린 : 천 키 당 약 5 초, 또는 ~ 22시간 전체 루프를 실행합니다. 나는 가능한 한 이것을 피하기를 원할 것이다.
이 패키지 중 하나의 문제 해결에 대한 제안이나 동일한 것을 달성하기위한 다른 옵션에 대한 아이디어에 대해 매우 감사드립니다.
UPDATE
mongodb와 같은 nosql 데이터베이스를 사용하는 것이 가능한 옵션인지 확인하십시오. http://www.mongodb.com/learn/nosql – stevenl
시도한 perl 및 모듈의 OS 및 버전은 무엇입니까? 평균 키와 평균값은 얼마나 큽니까? – ysth
"키 정렬"모드에서 항목을 생성 할 수 있습니까? 해시에서 btree로 "key sorted"삽입으로 성능을 개선했을 때 거대한 BerkeleyDB의 한 사례를 기억합니다. 개선은 매우 중요하지만 충분하지 않습니다. – AnFi