Tengo un script que utiliza un hash, que contiene cuatro cadenas como claves cuyos valores son hashes. Estos hash también contienen cuatro cadenas como claves que también tienen hashes como sus valores. Este patrón continúa hasta n-1 niveles, que se determina en tiempo de ejecución. El n-ésimo nivel de hash contiene valores enteros (en oposición a la referencia hash habitual).¿Puede BerkeleyDB en perl manejar un hash de hashes de hashes (hasta n)?
Instalé el módulo BerkeleyDB para Perl, así que puedo usar espacio en disco en lugar de RAM para almacenar este hash. Supuse que yo podría simplemente atar el hash a una base de datos, y que iba a funcionar, por lo que añade lo siguiente a mi código:
my %tags =() ;
my $file = "db_tags.db" ;
unlink $file;
tie %tags, "BerkeleyDB::Hash",
-Filename => $file,
-Flags => DB_CREATE
or die "Cannot open $file\n" ;
Sin embargo, me sale el error:
No se puede utilizar cuerdas ("HASH (0x1a69ad8)") como un HASH ref mientras "strict refs" en uso en getUniqSubTreeBDB.pl línea 31, línea 1.
Para probar, creé un nuevo script, con el código (arriba) vinculado al hash a un archivo. Luego agregué lo siguiente:
my $href = \%tags;
$tags{'C'} = {} ;
Y funcionó bien. Luego agregué:
$tags{'C'}->{'G'} = {} ;
Y daría casi el mismo error. Estoy pensando que BerkeleyDB no puede manejar el tipo de estructura de datos que estoy creando. Tal vez fue capaz de manejar el primer nivel (C -> {}) en mi prueba porque era solo una clave normal -> scaler?
De todos modos, cualquier sugerencia o afirmación de mi hipótesis sería apreciada.
s/would/should /. Realmente no lo probé. – ikegami
Intenté esto reemplazando las etiquetas $ root = \% con $ root = etiquetas de unión $, "DBM :: Deep", $ dbFile. El programa se ejecuta más lentamente, pero también está usando RAM? Pensé que si utilizabas una base de datos, ¿tu RAM no se usaría para almacenar el hash? – gravitas
@RSinghS, El objetivo de usar una base de datos sería evitar el uso de la memoria, no veo por qué usaría mucha memoria. – ikegami