Estoy trabajando con una estructura de árbol no tan pequeña (es un Burkhard-Keller-Tree,> 100 MB en memoria) implementada en C++. Los punteros a los hijos de cada nodo se almacenan en un QHash.Cuál es la manera más rápida de deserializar un árbol en C++
Cada nodo x tiene n hijos y [1] ... y [n], los bordes de los niños están etiquetados con la distancia de edición d (x, y [i]), usando un hash para almacenar el nodos es una solución obvia.
class Node {
int value;
QHash<int, Node*> children;
/* ... */
};
También quiero serializar y deserializar en un archivo (en la actualidad utilizo un QDataStream). El árbol se acaba de construir una vez y no cambia entonces.
Construir el árbol y deserializarlo es bastante lento. Estoy cargando el árbol de la manera obvia: construyendo recursivamente cada nodo. Creo que esto no es óptimo debido a los muchos nodos que se crean por separado con el operador new
. Leí en algún lado que new
es bastante lento. La construcción inicial no es un gran problema porque el árbol es bastante estable y no tiene que ser reconstruido muy a menudo. Pero cargar el árbol desde un archivo debe ser lo más rápido posible.
¿Cuál es la mejor manera de lograr esto?
Debe ser mucho mejor guardar todo el árbol en un solo bloque de memoria con nodos adyacentes. Serializar y deserializar se reduciría para guardar y cargar todo el bloque, que tengo que asignar solo una vez.
Pero para implementar esto tendría que volver a implementar QHash, AFAIK.
¿Qué harías para acelerar la deserialización?
Adición
Gracias por su sugerencia para hacer un poco de perfiles. Aquí están los resultados:
Mientras que la reconstrucción del árbol desde un archivo
1 % of the time is consumed by my own new calls
65 % is consumed by loading the QHash objects (this is implemented by the
Qt Library) of each node
12 % is consumed by inserting the nodes into the existing tree
20 % is everything else
Así que no es definitivamente mis nuevas llamadas que causan el retraso pero la reconstrucción de la QHash objetos en cada nodo. Esto se realiza básicamente con:
QDataStream in(&infile);
in >> node.hash;
¿Tengo que cavar en QHash y mirar lo que está pasando bajo el capó hay? Creo que la mejor solución sería un objeto hash que se pueda serializar con una sola operación de lectura y escritura sin la necesidad de reconstruir la estructura interna de datos.
¿Necesita el acceso rápido a nodos específicos y [i]? Intente utilizar QList en lugar de QHash, debería ser más rápido trabajar con E/S. – rpg
Sí. La búsqueda debe ser rápida. – WolfgangA