Появилась необходимость записывать данные в определенную строку в большом файле на пару гигов. Конкретнее, сейчас нужно считывать строку, далее ее обрабатывать, и потом удалять с текстового файла.
Нашел решение, состоящее в том что бы считать весь файл в переменную, потом внести изменения в переменную и по новому всё записать, но для большого объема данных это, очевидно, не лучший вариант.
Может быть это решить можно попроще? Если нет, то собственно сам вопрос, как записать данные в определенную строку без перезаписи всего файла?
Ответ
Файл - это просто последовательность байтов, среди которых встречаются переносы строк. Т.е. если вы работаете с файлом:
строка 1
строчка 2
строка 3
...то на самом деле на диске лежит последовательность байтов:
строка 1␊строчка 2␊строка 3
Вы можете перезаписать некоторые байты, не пересчитывая/перезаписывая весь файл, как внутри строки, так и между строк, например:
строка 1␊XXXXXXXXXXXтрока 3
тогда, просматривая файл по строкам, вы увидите:
строка 1
XXXXXXXXXXXтрока 3
...но никак нельзя удалить кусок из середины файла, ничего не делая с той частью, которая идет после удаляемого куска.
Вы можете построить код таким образом, чтобы читать из файла строки по одной и писать их сразу же в файл на новое место, например, если удаляем строку 1:
читаем "строка 1", пропускаем:
↓ позиция для чтения
строка 1␊строчка 2␊строка 3
↑ позиция для записи
читаем "строчка 2":
↓ позиция для чтения
строка 1␊строчка 2␊строка 3
↑ позиция для записи
Записываем "строчка 2" на новое место:
↓ позиция для чтения
строчка 2␊трочка 2␊строка 3
↑ позиция для записи
Аналогично, читаем "строка 3" и пишем ее на новое место:
↓ позиция для чтения
строчка 2␊строка 3␊строка 3
↑ позиция для записи
Обрезаем ненужное место в конце файла:
строчка 2␊строка 3␊
Если вы хотите не удалять строку, а вместо одной строки писать другую, то надо быть внимательным в случае если новая строка длиннее старой. На этот случай примера кода у меня нет.
Как видно, плоские файлы - неудачный способ хранения большого объема данных, если нужно что-то менять "посередине". Если вы сами создаете этот файл, возможно стоит рассмотреть другие форматы хранения, более эффективные для нужных вам операций.
Комментариев нет:
Отправить комментарий