Я работаю с не такой маленькой древовидной структурой (это дерево Беркхарда-Келлера,> 100 МБ в памяти), реализованной на C ++. Указатели на дочерние элементы каждого узла хранятся в QHash.
Каждый узел x имеет n дочерних элементов y [1] ... y [n], ребра для дочерних элементов помечены с помощью расстояния редактирования d (x, y [i]), поэтому для хранения узлов используется хеш является очевидным решением.
class Node {
int value;
QHash<int, Node*> children;
/* ... */
};
Я также хочу сериализовать и десериализовать его в файл (в настоящее время я использую QDataStream). Дерево просто строится один раз и не меняется тогда.
Построить дерево и десериализовать его довольно медленно. Я загружаю дерево очевидным способом: рекурсивно собирая каждый узел. Я думаю, что это неоптимально из-за множества узлов, которые создаются отдельно с помощью оператора new
. Я где-то читал, что new
довольно медленно. Первоначальная сборка не является большой проблемой, потому что дерево довольно стабильно и его не нужно перестраивать очень часто. Но загрузка дерева из файла должна быть максимально быстрой.
Какой лучший способ сделать это?
Должно быть, гораздо лучше сохранить все дерево в одном блоке памяти с соседними узлами. Сериализация и десериализация будут уменьшены для сохранения и загрузки всего блока, который я должен выделить только один раз.
Но чтобы реализовать это, мне пришлось бы повторно реализовать QHash, AFAIK.
Что бы вы сделали, чтобы ускорить десериализацию?
Добавление
Спасибо за ваше предложение сделать некоторые профилирования. Вот результаты:
При восстановлении дерева из файла
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
Так что, определенно, не мои новые вызовы вызывают задержку, а перестраивают объекты QHash на каждом узле. В основном это делается с помощью:
QDataStream in(&infile);
in >> node.hash;
Должен ли я копаться в QHash и смотреть, что там происходит под капотом? Я думаю, что лучшим решением будет объект хэширования, который можно сериализовать с помощью одной операции чтения и записи без необходимости перестраивать внутреннюю структуру данных.