Удаление строки из файла, чтение и перезапись очень неэффективны ... может кто-нибудь придумает лучший алгоритм? - PullRequest
0 голосов
/ 28 октября 2010

Удаление определенной строки / определенных байтов из файла очень неэффективно, поскольку необходимо выполнить много операций чтения и записи (перезаписи). Есть ли в любом случае, мы можем минимизировать работу в таком процессе? Представьте себе, если весь файл представляет собой набор связанных списков, и как пользователь мы знаем структуру этих связанных списков, было бы замечательно, поскольку мы можем легко выполнить такую ​​задачу достаточно эффективно. К сожалению, это не так.

Я задал этот вопрос, поскольку мне было любопытно узнать, как ОС управляет текстовым файлом.

Спасибо, Мир

Ответы [ 4 ]

1 голос
/ 28 октября 2010

Файл может быть описан как контейнер, состоящий из одного, нескольких или нескольких символов с фиксированным порядком;это очень похоже на char * в оперативной памяти, но на диске (мертвая память).То, как файл фактически (физически) размещен на оборудовании, зависит от раздела.Хотя было бы технически возможно выполнить удаление определенных символов без перезаписи файла, это все равно было бы неэффективно из-за размера блока и всего.

Некоторые приемы , используемые базами данныхи другое программное обеспечение для удаления данных без «закрытия разрыва данных» должны

  • использовать отдельные файлы для каждой строки
    • Pro : удаление и вставка строклегко сделать
    • Con : удаление и вставка строк означает переименование файлов (например, RENUM в GW-BASIC), если каждый файл не знает, что он предыдущий и следующий файл .... Но в целом это плохой подход .
  • эмулировать FS внутри файла, где каждая строка является виртуальным файлом (с заголовком, размером и т. д.)
    • Pro : работает так же, как связанный список для добавления и удаления строк
    • Con : много работыдля простых текстовых данных ....
  • и т. д.

Tздесь не так много, что можно сделать иначе.Есть много опций, которые можно использовать для «оптимизации» манипулирования данными вместо использования плоского файла.Это не падает на ОС или FS, чтобы решить эту проблему.В большинстве случаев, когда плоский файл достаточно хорош, переписывание части файла для удаления некоторых данных является приемлемым решением.

1 голос
/ 28 октября 2010

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

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

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

1 голос
/ 28 октября 2010

Лучшее, что вы можете сделать, - это создать редкое хранилище для файла.То есть вычеркните строку и найдите способ указать, что строка «пустая».

0 голосов
/ 28 октября 2010

Не без помощи файловой системы. И это служба ОС, и она не может быть адресована в «чистом» C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...