Удалить начало файла без перезаписи всего файла

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

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

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

Есть ли какой-нибудь метод, API, трюк, взломать, чтобы обрезать начало такого файла?

Ответы

Ответ 2

Самое простое решение для ваших старых приложений - файловая система FUSE, которая дает им доступ к базовому файлу, но смещение циклически сдвигается. Это позволит вам реализовать кольцевой буффер на физическом уровне. Уровень FUSE был бы довольно тривиальным, так как ему нужно было только отрегулировать все файловые объекты с помощью константы, modulo filesize.

Ответ 3

Как создать отдельный процесс, который переименует выходной файл, когда он достигнет предопределенного размера (например, добавив время linux в конце имени файла).

Это позволит вам сохранить старые данные, а основной процесс воссоздает выходной файл при следующем его записи.

Другое задание cron может время от времени удалять старый файл.