Существует ли быстрый способ добавления или удаления содержимого в середине очень большого файла - PullRequest
0 голосов
/ 22 апреля 2011

Скажем, у меня очень большой файл (скажем,> 1 ГБ), и я хочу добавить один символ в середине.Возможно ли сделать это без чтения и записи всего файла?Мое текущее решение заключается в следующем (в псевдокоде):

x = 0
chunk = read 4KB chunk x of input file
if chunkToEdit = x, chunk = addCharacter(chunk)
append chunk to the output file 
x = x + 1
repeat last 4 steps until input file is fully read
delete input file
move output file to input file

Хотя это работает, это приводит к 1 ГБ чтения и 1 ГБ записи для изменения одного символа.Также требуется 1 ГБ свободного места на диске.Я бы предпочел изменить часть файла, которую нужно изменить на месте, поэтому мне нужно только прочитать и записать одну часть файла (т.е. 4 КБ чтения и 4 КБ записи).Возможно ли это (или решение лучше моего)?

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

Ответы [ 2 ]

1 голос
/ 22 апреля 2011

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

  • i = 0
  • чтение последнего ( n байт * i) файла
  • обратная запись в файл, сдвинутый на 1 символ
  • i ++
  • , повторение до достижения точки вставки
  • запись одного символа

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

1 голос
/ 22 апреля 2011

Нет.Файлы не работают так.Если вам нужно изменить размер файла, вам нужно работать от точки модификации до конца.

Если вы не используете формат файла, который может обрабатывать вставки / удаления чисто, но звучит так, как вынет.

...