Sto lavorando con una struttura ad albero non troppo piccola (è un albero Burkhard-Keller,> 100 MB di memoria) implementato in C++. I puntatori ai figli di ciascun nodo sono memorizzati in un QHash.Qual è il modo più veloce per deserializzare un albero in C++
Ogni nodo x ha n figli y [1] ... y [n], i bordi dei bambini sono etichettati con la distanza di modifica d (x, y [i]), quindi utilizzando un hash per memorizzare il i nodi sono una soluzione ovvia.
class Node {
int value;
QHash<int, Node*> children;
/* ... */
};
voglio anche serializzare e deserializzare in un file (Attualmente uso un QDataStream). L'albero è appena costruito una volta e non cambia poi.
Costruire l'albero e deserializzare è piuttosto lento. Sto caricando l'albero in modo ovvio: costruendo ricorsivamente ciascun nodo. Penso che questo non sia ottimale a causa dei molti nodi creati separatamente con l'operatore new
. Ho letto da qualche parte che lo new
è piuttosto lento. La build iniziale non è un grosso problema perché l'albero è piuttosto stabile e non deve essere ricostruito molto spesso. Ma caricare l'albero da un file dovrebbe essere il più veloce possibile.
Qual è il modo migliore per farlo?
Deve essere molto meglio salvare l'intero albero in un singolo blocco di memoria con nodi adiacenti. La serializzazione e la deserializzazione sarebbero quindi ridotte per salvare e caricare l'intero blocco, che devo allocare solo una volta.
Ma per implementarlo dovrei reimplementare QHash, AFAIK.
Cosa faresti per accelerare la deserializzazione?
Addendum
Grazie per il suggerimento di fare un po 'di profilazione. Ecco i risultati:
Mentre ricostruire l'albero da un file
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
Quindi non è sicuramente mie nuove chiamate che causano il ritardo, ma la ricostruzione del QHash oggetti in ogni nodo. Questo è fondamentalmente fatto con:
QDataStream in(&infile);
in >> node.hash;
Devo scavare QHash e guardate cosa sta succedendo sotto il cofano c'è? Penso che la soluzione migliore sarebbe un oggetto hash che può essere serializzato con una singola operazione di lettura e scrittura senza la necessità di ricostruire la struttura interna dei dati.
Avete bisogno dell'accesso rapido a nodi specifici y [i]? Prova a utilizzare una QList invece di QHash, dovrebbe essere più veloce da utilizzare quando si tratta di I/O. – rpg
Sì. La ricerca deve essere veloce. – WolfgangA