2009-04-01 3 views
14

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

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

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

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

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

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

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

+2

Одним большого преимущества такой операции является то, что это позволит избежать циклов стирания на флэш-носителе. – Michael

+0

Тем временем эта тема уже как ошибка на странице «усекать» linux man. Я уверен, что когда-нибудь это будет реализовано, через 20 лет после того, как я впервые попросил его – Lothar

+0

такая же проблема, как: http://stackoverflow.com/questions/339483/how-can-i-remove-the-first-line- in-text-file-using-bash-sed-script, хотя здесь более явственно –

ответ

5

Усечь файлы на передней панели, похоже, не сложно реализовать на системном уровне.

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

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

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

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

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

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

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

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

0

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

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

0

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

1

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

12

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

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

+0

Также интересный связанный флаг 'FALLOC_FL_COLLAPSE_RANGE'. – catpnosis

+0

Спасибо, я добавил это. –

0

Существует также команда Unix называется head - так что вы могли бы сделать это с помощью:

head -n1000 file > file_truncated 
+0

дублированный ответ, такой же, как 'tail +1000> file_truncated' – user3338098

Смежные вопросы