2016-12-20 4 views
0

Представьте себе огромный файл, который должен быть отредактирован моей программой. Чтобы увеличить время чтения, я использую mmap(), а затем только считываю детали, которые просматриваю. Однако, если я хочу добавить строку в середине файла, для чего лучше всего подходит?Как отредактировать большой файл

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

Так что мой вопрос в основном: Каков наиболее эффективный способ добавления данных в середине огромного файла?

+0

И как раз обратите внимание, как вы спрашиваете о «редактировании» больших файлов: если бы вы искали хороший редактор, чтобы делать такие вещи, я бы указал вам на VisualSlick. Да, коммерческий продукт; но по моему опыту, безусловно, лучшим редактором при работе с действительно большими файлами. – GhostCat

ответ

4

Единственный способ вставить данные в середине любого (огромного или маленького) файла (в Linux или POSIX) - это скопировать этот файл (в новый, затем позже rename(2) экземпляр в качестве оригинала). Таким образом, вы скопируете его голову (до точки вставки), вы добавите данные в эту копию, а затем скопируете хвост (после точки вставки). Вы могли бы также назвать posix_fadvise(2) (или даже конкретный Linux readahead(2) ...), но это не снимает необходимость скопировать все данные. mmap(2) может использоваться, например. для замены read(2), но все, что вы делаете, требует копирования всех данных.

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

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

Да, это концептуально единственный способ.

Вам следует подумать о том, чтобы использовать что-то еще, что обычный текстовый файл: посмотрите на SQLite или GDBM (они могут быть очень эффективными в вашем случае использования). См. Также this answer. Оба предоставляют вам более высокую абстракцию, чем файлы POSIX, поэтому дайте вам возможность «вставлять» данные (конечно, они по-прежнему внутренне основаны на POSIX-файлах и используют их).

+0

Я думаю, что «конечно» часть с lseek и write важна. –

+0

Итак, как SQLite решает ту же проблему? – iveqy

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