Ho uno script che utilizza un hash, che contiene quattro stringhe come chiavi i cui valori sono hash. Questi hash contengono anche quattro stringhe come chiavi che hanno anche hash come valori. Questo modello continua fino ai livelli n-1, che viene determinato in fase di esecuzione. L'ennesimo livello di hash contiene valori interi (al contrario dei soliti riferimenti ad hash).Can BerkeleyDB in perl gestisce un hash di hash di hash (fino a n)?
Ho installato il modulo BerkeleyDB per Perl in modo da poter utilizzare lo spazio su disco anziché RAM per archiviare questo hash. Ho pensato che avrei potuto semplicemente legare la hash a un database, e sarebbe lavorare, così ho aggiunto il seguente al mio codice:
my %tags =() ;
my $file = "db_tags.db" ;
unlink $file;
tie %tags, "BerkeleyDB::Hash",
-Filename => $file,
-Flags => DB_CREATE
or die "Cannot open $file\n" ;
Tuttavia, ottengo l'errore:
Impossibile utilizzare stringa ("HASH (0x1a69ad8)") come riferimento HASH mentre "strict refs" in uso su getUniqSubTreeBDB.pl riga 31, riga 1.
Per testare, ho creato un nuovo script, con il codice (sopra) quello legato hash in un file. Poi ho aggiunto il seguente:
my $href = \%tags;
$tags{'C'} = {} ;
E ha funzionato bene. Poi ho aggiunto:
$tags{'C'}->{'G'} = {} ;
E darei più o meno lo stesso errore. Sto pensando che BerkeleyDB non possa gestire il tipo di struttura dati che sto creando. Forse è stato in grado di gestire il primo livello (C -> {}) nel mio test perché era solo una normale chiave -> scaler?
Ad ogni modo, qualsiasi suggerimento o affermazione della mia ipotesi sarebbe apprezzata.
s/would/should /. In realtà non l'ho provato. – ikegami
Ho provato questo sostituendo $ root = \% tag con $ root = tie $ tags, "DBM :: Deep", $ dbFile. Il programma viene eseguito più lentamente, ma utilizza anche la RAM? Ho pensato che se si utilizza un database la RAM non verrà utilizzata per memorizzare l'hash? – gravitas
@RSinghS, L'intero punto di utilizzo di un database sarebbe evitare l'uso della memoria, non vedo perché userebbe molta memoria. – ikegami