Подтвердить что ты не робот

Можно ли добавлять данные в файл без перезаписи?

Я имею дело с очень большими двоичными файлами (от нескольких GB до нескольких TB на файл). Эти файлы существуют в устаревшем формате, и для обновления требуется запись заголовка в FRONT файла. Я могу создать новый файл и переписать данные, но иногда это может занять много времени. Мне интересно, есть ли более быстрый способ выполнить это обновление. Платформа ограничена Linux, и я готов использовать низкоуровневые функции (ASM, C, С++)/файловые системы, чтобы это произошло. Примочной библиотекой является Java и JNI вполне приемлемо.

4b9b3361

Ответ 1

Нет общего способа сделать это изначально.

Возможно, некоторые файловые системы предоставляют некоторые функции для этого (не могу дать никакого намека на это), но ваш код будет зависящим от файловой системы.


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

Ответ 2

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

 std::string records;
 ofstream out;
std::copy( records.rbegin(), records.rend(), std::ostream_iterator<string>(out));

Ответ 3

Это зависит от того, что вы подразумеваете под "файловыми трюками". Если вы захотите сгладить формат файловой системы на диске, а размер заголовка, который вы хотите добавить, кратен размеру блока файловой системы, тогда вы можете написать программу для непосредственного управления файловой системой на дисковых структурах (при отключенной файловой системе).

Это предприятие настолько же волосатое, как кажется, - скорее всего, это будет стоить того, если у вас есть сотни этих гигантских файлов для обработки.

Ответ 4

Я бы просто использовал стандартные инструменты Linux для этого.
Написание другого приложения, чтобы сделать это, похоже, было бы неоптимальным.

cat headerFile oldFile > tmpFile && mv tmpFile oldFile

Ответ 5

Я знаю, что это старый вопрос, но я надеюсь, что это поможет кому-то в будущем. Подобно моделированию файловой системы, вы можете просто использовать именованный канал:

mkfifo /path/to/file_to_be_read
{ echo "HEADER"; cat /path/to/source_file; } > /path/to/file_to_be_read

Затем вы запускаете свою унаследованную программу с помощью /path/to/file_to_be_read, а вход будет:

HEADER
contents of /path/to/source_file
...

Это будет работать, пока программа читает файл последовательно и не выполняет mmap() или rewind() мимо буфера.