TranE91
@TranE91
Senior Android Engineer

Сохранение древовидной структуры в файл, best way?

Всем доброго дня, столкнулся с проблемой выбора структуры данных и файла для хранения N-дерева.
Обьект, по факту из себя представляет из себя следующее:
class Node{
   int data;
   Node[] childArray;
}


Вот и столкнулся с проблемами:
a) Такая структура, как обьект в памяти, при количестве узлов от ~10^6, потребляет изрядно памяти ОЗУ. При переделке обьекта на примитивы и работы уже с массивом данных со смещениями, проблема решается и память не так сильно кушается(примерно раза в 3-5). т/е/ что-то подобное:
int node = 0b1111111111_00000000_11111111;
// 1ые 8 бит отвечают за данные
// 2ые 8 бит child_size
// 3ие 8 бит информируют о необходимом смещении в массиве, чтобы дойти к следующему элементу на текущем уровне

б) Запись дерева в файл. При сохранении обьекта в XML / JSON на выходе получаем весьма весомый файл от 50мб при N=~10^6. При создании собственного велосипеда и переделки дерева на линейную запись в файле, получаем весьма удвлтворительный вариант с 6-8мб на выходе, но появляется проблема с масштабируемостью. Т/е/ для добавления произвольного узла в дерева, следует пройтись по всем узлам для коррекции смещений узлов в файле и перезаписать. Существуют ли непрожорливые форматы данных для хранения N-нарного дерева с возможностью масштабирования?
  • Вопрос задан
  • 349 просмотров
Решения вопроса 1
@nirvimel
для добавления произвольного узла в дерева, следует пройтись по всем узлам для коррекции смещений узлов в файле и перезаписать.

Это в любом случае неизбежно. Единственно что можно сделать для сокращения дискового I/O - это, вместо записи множества кусков (через seek->write->seek->write), использовать встроенные в ОС механизм memory mapping (в Java он реализован через MappedByteBuffer), тогда проблема оптимизации кеширования и сброса буферов на диск ложится полностью на ОС.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы