해시를 사용하는 스크립트가 있습니다. 해시를 사용하는 스크립트는 값이 해시 인 키로 4 개의 문자열을 포함합니다. 이 해시에는 네 개의 문자열이 값으로 해시가있는 키로 포함되어 있습니다. 이 패턴은 실행시 결정되는 n-1 레벨까지 계속됩니다. n 번째 레벨의 해시에는 정수가 포함됩니다 (일반적인 해시 - 참조와 반대).Perl에서 BerkeleyDB가 해시 해시의 해시를 처리 할 수 있습니까 (최대 n)?
이 해시를 저장하기 위해 RAM 대신 디스크 공간을 사용할 수 있도록 Perl 용 BerkeleyDB 모듈을 설치했습니다. 나는 단순히 데이터베이스에 해시를 묶을 수 있고, 작동한다고 가정, 그래서 나는 내 코드에 다음과 같은 추가 :
문자열을 사용할 수 없습니다
그러나my %tags =() ;
my $file = "db_tags.db" ;
unlink $file;
tie %tags, "BerkeleyDB::Hash",
-Filename => $file,
-Flags => DB_CREATE
or die "Cannot open $file\n" ;
, 나는 오류 ("HASH (0x1a69ad8)")을 HASH ref로 사용하고 "strict refs"는 getUniqSubTreeBDB.pl 31 줄 1 행에서 사용합니다.
테스트하려면 위 코드를 묶은 새 스크립트를 만들었습니다 파일에 해쉬하기. 그런 다음 다음을 추가했습니다.
my $href = \%tags;
$tags{'C'} = {} ;
그리고 잘 돌아갔습니다. 그럼 내가 추가 :
$tags{'C'}->{'G'} = {} ;
그리고 그것은 거의 같은 오류를 줄 것이다. BerkeleyDB가 내가 만드는 데이터 구조 유형을 처리 할 수 없다고 생각합니다. 어쩌면 그것은 일반 키 -> 스케일러 였기 때문에 첫 번째 레벨 (C -> {})을 테스트에서 처리 할 수 있었 을까?
어쨌든 내 가설에 대한 제안이나 확인은 인정 될 것입니다.
s/would/should /. 나는 실제로 그것을 테스트하지 않았다. – ikegami
나는 $ root = \ % 태그를 $ root = tie $ tags, "DBM :: Deep", $ dbFile로 바꾸어서 이것을 시도했다. 프로그램이 더 느리게 실행되지만 RAM을 사용하고 있습니까? 데이터베이스를 사용할 경우 RAM이 해시를 저장하는 데 사용되지 않을 것이라고 생각했습니다. – gravitas
@RSinghS, 데이터베이스 사용의 전체 요점은 메모리 사용을 피하는 것이고 많은 메모리를 사용해야하는 이유는 없습니다. – ikegami