Mam skrypt, który wykorzystuje skrót, który zawiera cztery ciągi jako klucze, których wartości są wartościami mieszającymi. Te skróty zawierają również cztery ciągi jako klucze, które również mają wartości mieszane. Ten wzorzec utrzymuje się do poziomu n-1, który określa się w czasie wykonywania. N-poziom haszu zawiera wartości całkowite (w przeciwieństwie do zwykłej wartości referencyjnej).Czy BerkeleyDB w perlu obsługuje skrót mieszania skrótów (do n)?
Zainstalowałem moduł BerkeleyDB dla Perla, więc mogę użyć miejsca na dysku zamiast pamięci RAM do przechowywania tego skrótu. Sądziłem, że mogę po prostu związać hash do bazy danych, i będzie pracować, tak I dodaje następujące do mojego kodu:
my %tags =() ;
my $file = "db_tags.db" ;
unlink $file;
tie %tags, "BerkeleyDB::Hash",
-Filename => $file,
-Flags => DB_CREATE
or die "Cannot open $file\n" ;
Jednakże pojawia się błąd:
nie można używać znaków ("HASH (0x1a69ad8)") jako HASH ref, a "ścisłe refs" w linii getUniqSubTreeBDB.pl 31, wiersz 1.
Aby przetestować, stworzyłem nowy skrypt, z kodem (powyżej), który był związany mieszać do pliku. Następnie dodałem:
my $href = \%tags;
$tags{'C'} = {} ;
I działało dobrze. Następnie dodałem:
$tags{'C'}->{'G'} = {} ;
I dałoby prawie taki sam błąd. Myślę, że BerkeleyDB nie poradzi sobie z rodzajem struktury danych, którą tworzę. Może był w stanie obsłużyć mój pierwszy poziom (C -> {}), ponieważ był to zwykły klucz -> skaler?
W każdym razie, wszelkie sugestie lub afirmacje mojej hipotezy byłyby docenione.
s/would/should /. Właściwie to nie testowałem. – ikegami
Próbowałem tego, zastępując $ root = \% tagami $ root = tie $ tags, "DBM :: Deep", $ dbFile. Program działa wolniej, ale korzysta również z pamięci RAM? Myślałem, że jeśli użyjesz bazy danych, twoja pamięć RAM nie będzie używana do przechowywania hasza? – gravitas
@RSinghS, Cały punkt korzystania z bazy danych polegałby na unikaniu używania pamięci, nie rozumiem, dlaczego miałaby ona korzystać z dużej ilości pamięci. – ikegami