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

Усекать файл спереди

Проблема, над которой я работала, недавно заставила меня позаботиться о том, чтобы я мог убрать перед собой файл. Похоже на "усечение спереди", если хотите. Усечение файла на задней панели является общей операцией - что-то мы делаем, даже не задумываясь об этом. Но вырвать фронт файла? Сначала звучит смешно, но только потому, что мы были обучены думать, что это невозможно. Но в некоторых ситуациях операция lop может быть полезна.

Простым примером (конечно, не единственным или обязательно лучшим примером) является очередь FIFO. Youre добавляет новые элементы в конец файла и вытаскивает элементы из файла с фронта. Файл растет с течением времени, а theres - огромное пустое пространство спереди. С текущими файловыми системами существует несколько способов решения этой проблемы:

  • По мере удаления каждого элемента скопируйте оставшиеся предметы, чтобы заменить его, и усечь файл. Хотя он работает, это решение очень дорого Время-накрест.
  • Следить за размером пустого места в фронт, и когда он достигает конкретный размер или процент весь размер файла, переместить все вверх и обрезать файл. Это много более эффективны, чем предыдущие решение, но все же стоит время, когда элементы перемещаются в файл.
  • Реализация круговой очереди в файл, добавив новые предметы в отверстие в перед файлом в качестве элементов удален. Это может быть довольно эффективным, особенно если вы не возражаете против возможность выхода из порядок в очереди. Если вы заботитесь о порядке, то потенциал вынуждены перемещать предметы вокруг. Но в общий, круговая очередь довольно легко реализовать и управлять диском пространство хорошо.

Но если была операция lop, удаление элемента из очереди было бы так же просто, как обновление маркера начала файла. Как легко, на самом деле, как обрезание файла. Почему тогда нет такой операции?

Я немного разбираюсь в реализации файловых систем и не вижу особых причин, по которым это будет сложно. Мне кажется, что все, что потребуется, - это другое слово (возможно, слово?) Для каждой записи выделения, чтобы сказать, где начинается файл в блоке. При использовании емкостей емкостью 1 терабайт до 100 долларов США, это выглядит довольно маленькой ценой за такую ​​функциональность.

Какие другие задачи будут упрощены, если вы сможете вырвать фронт файла так же эффективно, как вы можете усечь в конце?

Можете ли вы придумать какие-либо технические причины, по которым эта функция не может быть добавлена ​​в современную файловую систему? Другие, нетехнические причины?

4b9b3361

Ответ 1

Усеченные файлы спереди кажутся не слишком сложными для реализации на системном уровне.

Но есть проблемы.

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

Другими словами, усечение начала изменило бы единственную точку отсчета, и это плохо.

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

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

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

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

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

Ответ 2

В файловых системах, которые поддерживают разреженные файлы, "пробивая" отверстие и удаляя данные в произвольной позиции файла, очень просто. Операционная система просто должна отмечать соответствующие блоки как "не выделенные". Удаление данных с начала файла является лишь особым случаем этой операции. Главное, что требуется, - это системный вызов, который будет реализовывать такую ​​операцию: ftruncate2 (int fd, off_t offset, size_t count).

В системах Linux это фактически реализуется с системным вызовом fallocate, указав флаг FALLOC_FL_PUNCH_HOLE для обнуления диапазона и флаг FALLOC_FL_COLLAPSE_RANGE, чтобы полностью удалить данные в этом диапазоне. Обратите внимание, что существуют ограничения на то, какие диапазоны могут быть указаны, и что не все файловые системы поддерживают эти операции.

Ответ 3

NTFS может сделать что-то вроде этого с помощью разреженной поддержки файла, но это не полезно.

Ответ 4

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

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

Ответ 5

На самом деле есть базовые файловые системы для записей - у IBM есть одна, и я считаю, что у DEC VMS тоже было это средство. Кажется, я помню, что оба разрешены (допустим, я думаю, они все еще существуют), удаляя и вставляя случайные позиции в файл.

Ответ 6

Существует также команда unix под названием head - поэтому вы можете сделать это через:

head -n1000 file > file_truncated

Ответ 7

может достичь этой цели в два этапа

long fileLength; //file total length
long reserveLength; //reserve length until the file ending
int fd; //file open for read & write

sendfile(fd, fd, fileLength-reserveLength, reserveLength);
ftruncate(fd, reserveLength);