|
Сериализация дерева объектов
|
|||
---|---|---|---|
#18+
Есть коллекция объектов в виде иерархического дерева, похоже на папки в проводнике, где в каждой папке хранятся определенные категории объектов. Сейчас это все сохраняется на диск в виде обычных папок и файлов. Т.е. в том же виде по сути как и представлено в памяти. Перед сохранением коллекция полностью удаляется с диска и вся перезаписывается заново, даже если был изменен только один объект из сотни. Все это занимает слишком много времени. Какое решение лучше использовать чтобы сохранять только измененные объекты, а не все дерево целиком. Обьекты можно создавать, изменять, удалять, а также перетаскивать из одной папки в другую. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2021, 20:59 |
|
Сериализация дерева объектов
|
|||
---|---|---|---|
#18+
Подобный кейс описывался в книге "Жемчужины программирования". Вместо копирования всего дерева файлов и каталогов - создавась структура которая отражала только изменения. А все что не менялось - сохранялось как symbolic-links на старое дерево. Как SVN. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2021, 23:37 |
|
Сериализация дерева объектов
|
|||
---|---|---|---|
#18+
Eolt, это довольно сложный вопрос, что бы быстро наваять какое-то наколеночное решение довольно много реализаций этой идеи: документоориентированная БД (mongodb например), любая современная файловая система (есть либы для отображения на файл, например pCloud использует одну из таких) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 10:10 |
|
Сериализация дерева объектов
|
|||
---|---|---|---|
#18+
Eolt, Для начала: мухи объекты - отдельно, дерево (id объекта - id родителя) - отдельно. После этого тебе надо переписывать только дерево и изменённые объекты (или добавлять их diff). Да, ты пожертвуешь структурой в фс при этом, НО ты можешь сделать драйвер для fuse и работать с этим как с фс! (если знаешь, что это такое) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 10:44 |
|
Сериализация дерева объектов
|
|||
---|---|---|---|
#18+
Еще важно как выглядит исходная структура в Java и как трекается изменение. На узел. Или на цепочку от корня. Нужно-ли обходить все 100500 потомков корня или просто достаточно пойти по атрибуту lastUpdateTime. И для красивой реализации в диске - нужна нормальная файловая система. FAT32 на флешке - не подходит. Линуксовые - (ext4, btrfs, xfs...) вроде все поддерживают симлинки на фолдеры. NTFS тоже поддерживает. Но я-бы почитал по Java как этот API использовать практически. Возможно там - нюансы. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 11:14 |
|
Сериализация дерева объектов
|
|||
---|---|---|---|
#18+
Eolt Перед сохранением коллекция полностью удаляется с диска и вся перезаписывается заново, даже если был изменен только один объект из сотни. Все это занимает слишком много времени. Какое решение лучше использовать чтобы сохранять только измененные объекты, а не все дерево целиком. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 11:16 |
|
Сериализация дерева объектов
|
|||
---|---|---|---|
#18+
Мне кажется, что совершенно несложно было бы разработать какую-то структуру для того чтобы хранить это без перезаписывания всего файла. Но в ней будут со временем накапливаться неиспользуемые места, которые надо будет время от времени уплотнять тем же перезаписыванием. По сути тебе просто надо реализовать что-то вроде типичного memory heap с GC, как в .NET или Java, просто на диске. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 12:53 |
|
Сериализация дерева объектов
|
|||
---|---|---|---|
#18+
Я так понимаю что при "наивной" сериализации всего дерева объектов у нас могут появится узлы-призраки. Те которые были удалены в Java-дереве но по которым не пришла команда на удаление с диска. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 13:24 |
|
Сериализация дерева объектов
|
|||
---|---|---|---|
#18+
Возможно поэтому Eolt удаляет все дерево файлов и каталогов. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 14:15 |
|
Сериализация дерева объектов
|
|||
---|---|---|---|
#18+
Я тоже уверен, что предварительная очистка всего используется в качестве простого решения. Например, вдруг, подветка должна стать корневой, а всё выше неё по стволу должно исчезнуть... Наверное отсюда и вопрос возник. Я конечно голосую за использование цельного алгоритма по всем правилам, и тогда решение будет универсальным. Сам не знаток, но выше что-то было предложено. Но будучи лентяем, попробовал бы другой вариант, КМК, ответ в самом вопросе - сериализация. Написано, что структура - деревья. Пусть даже кусты/лес деревьев. В этом случае все ветки (их ИД) взаимно однозначо ложатся в строки таблицы. После чего сравнение строк (было - стало) не должно вызывать заметных трудностей (ибо как раз в сериализованном виде). При этом дерево можно хранить как дерево, а для сравнений преобразовывать в табличные строки. Строки такого типа: a-b-c-d-obj1 a-b-c-w-obj2 a-b-x-e-k-l-m-n-obj3 ... ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 19:09 |
|
Сериализация дерева объектов
|
|||
---|---|---|---|
#18+
Можно сделать так. Узел дерева. Использует атрибут lastActionTimestamp. Код: javascript 1. 2. 3. 4. 5.
При обновлениях и вставках - изменяется метка времени на всех родителях и на узле. При удалении узла - фиксируется метка только для цепочки родителей. Тогда алгоритм сериализации - это обход всех узлов дерева по условию что дата обновления - старше чем дата с которой дерево было загружено изначально. Будет максимально быстро. Я гарантирую это (с) Сохранять дерево - в новое место. А восстанавливать.... хз. Наверное из снапшота старого дерева + изменения. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 19:17 |
|
Сериализация дерева объектов
|
|||
---|---|---|---|
#18+
Расскажу давню историю, времён FAT, о пользе FAT/NTFS etc. Приходит ко мне чел-к с вопросом: Можно ли состряпать СУБД за 3 дня? ))) Окзаалось, что подходит срок договора, и нет СУБД от слова совсем, т.к. все рассчитывали на штатную, а про неё только что сказали, что не получится (задним числом известно, что диагноз был ошибочным, но что есть, то есть ...) А рук-ль всего проекта давит, якобы даже сам сможет за пару дней, и даже вот завтра начнёт и напишет. Ха-ха-ха - отвечаю. Конечно же, предлагаю обозвать ФС СУБДшкой. Таблицы, записи, поля - каталоги и файлы ФС. В ней ведь есть всё достаточное: удалить вставить, создать, редактировать, поиск... Ну он так и выкрутился с небольшой оболочкой на ЯП. Ну а рук-ль, конечно же "не шмогла". ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 19:50 |
|
Сериализация дерева объектов
|
|||
---|---|---|---|
#18+
Я помню одно из определений СУБД. Это - ПО для ввода инфы. Процессинга. И извлечения отчотов. Классик– Товарищ Зубо, – сказал он. – На что ты имеете заявку? – На Черный Ящик, – уныло сказал комендант. – Дело номер девяносто седьмое. – Я тебя не спрашиваю, какое номер дело, – возразил Хлебовводов. – Я тебя спрашиваю: ты на черный ящик заявку имеете? – Имею, – признался комендант. – Чья заявка? – Товарища Привалова из НИИЧАВО. Вон он сидит. – Да, – страстно сказал я, – но мой Черный Ящик – это не ящик... точнее – не совсем ящик... Однако Хлебовводов внимания на меня не обратил. Он посмотрел футляр на свет, потом приблизился к коменданту и зловеще произнес: – Ты что же бюрократию разводите? Ты что же, не видите, какого оно цвета? На твоих же глазах рационализацию произвели, вот товарищ представитель от науки на твоих глазах сидит, ждет, понимаете, выполнения заявки, ужинать давно пора, на дворе темно, а ты что же – номерами здесь жонглируете? Я чувствовал, что на меня надвигается какая-то тоска, что будущее мое заполняется каким-то унылым кошмаром, непоправимым и совершенно иррациональным. Но я не понимал, в чем дело, и только продолжал жалко бубнить, что мой ящик – это не совсем ящик, а точнее, совсем не ящик. Мне хотелось разъяснить, рассеять недоразумение. Комендант тоже бубнил что-то убедительное, но Хлебовводов, погрозив ему кулаком, уже возвращался на свое место. – Ящик, Лавр Федотович, черный, – с торжеством доложил он. – Ошибки никакой быть не может, сам смотрел. И заявка имеется, и представитель присутствует. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 19:58 |
|
Сериализация дерева объектов
|
|||
---|---|---|---|
#18+
exp98 Я тоже уверен, что предварительная очистка всего используется в качестве простого решения. Например, вдруг, подветка должна стать корневой, а всё выше неё по стволу должно исчезнуть... Наверное отсюда и вопрос возник. Я конечно голосую за использование цельного алгоритма по всем правилам, и тогда решение будет универсальным. Сам не знаток, но выше что-то было предложено. Но будучи лентяем, попробовал бы другой вариант, КМК, ответ в самом вопросе - сериализация. Написано, что структура - деревья. Пусть даже кусты/лес деревьев. В этом случае все ветки (их ИД) взаимно однозначо ложатся в строки таблицы. После чего сравнение строк (было - стало) не должно вызывать заметных трудностей (ибо как раз в сериализованном виде). При этом дерево можно хранить как дерево, а для сравнений преобразовывать в табличные строки. Строки такого типа: a-b-c-d-obj1 a-b-c-w-obj2 a-b-x-e-k-l-m-n-obj3 ... есть два типа сохранения, которые друг-друга дополняют
осталось выбрать ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2021, 11:30 |
|
|
start [/forum/topic.php?fid=16&msg=40074296&tid=1339646]: |
0ms |
get settings: |
12ms |
get forum list: |
13ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
31ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
others: | 246ms |
total: | 386ms |
0 / 0 |