Перестановка содержимого файла на месте

Я пытаюсь оптимизировать формат архива, который хранит данные в узлах. Со временем контейнер становится грязным (накапливаются небольшие непригодные для использования "свободные" космические узлы и т. Д.). То, что я делаю, похоже на дефрагментацию. У меня уже есть список всех местоположений данных и представление, в котором я хотел бы, чтобы данные находились в их окончательном состоянии, но я изо всех сил пытаюсь перевести фактические данные из их текущей конфигурации в оптимальную конфигурацию. Элементы не одинакового размера и не кратны ни одному наименьшему блоку (если не считать байты). Есть какой-то очевидный метод, который я пропускаю? Я даже не уверен, как называется эта проблема при поиске алгоритмов. Самым близким, что я получил, является сортировка на месте.

До сих пор я пробовал обмениваться блоками данных, но мне нужно отслеживать фрагменты узлов, и это стало слишком грязно, чтобы быть осуществимым.

Я не хочу прибегать к написанию временной копии и ее замене, так как файлы очень большие.

1 ответ

Решение

Что касается производительности, копирование данных в новый файл, скорее всего, будет лучшим выбором.

Если доступное дисковое пространство является проблемой, у вас впереди веселое время, потому что это потребует некоторых изысканных хакерских навыков, чтобы быстро. Я думаю, что лучшее, что можно сделать, - это выделить большой кусок буферной памяти и сохранить список дыр в файле, данные которого находятся в этом буфере. Затем вы начинаете с заполнения этого буфера всем, что неуместно, начиная с начала файла. Когда буфер заполнен, вы можете копировать данные из любого места в отверстие и продолжать помещать данные в буфер в конце отверстия, которое вы заполняете. Всякий раз, когда у вас заканчивается буферное пространство, вам нужно будет перепрыгнуть через самую большую доступную дыру и переместить данные, которые там находятся. Как я уже сказал, это будет нелегко, но это может быть весело...

Другие вопросы по тегам