Эффективный поиск в строке и замена для большого файла - PullRequest
3 голосов
/ 07 апреля 2009

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

Файл будет XML-файлом. Файл будет содержать (в первых нескольких строках) текстовую строку, которую необходимо удалить или заменить пробелом (неважно, какой).

Проблема в том, что файл XML имеет размер в несколько гигабайт, но фиксированная строка поиска и замены будет происходить в течение первых 4k или около того.

Каков наилучший способ перезаписи строки поиска и сохранения на месте без необходимости считывания всей суммы в память и / или чрезмерной записи на диск?

Ответы [ 2 ]

1 голос
/ 07 апреля 2009

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

Если бы это было для среды Unix, я бы хотел использовать mmap() для сопоставления подходящей части начала файла в ОЗУ, затем отредактировать его на месте и сделать это.

Этот фрагмент показывает, как использовать эквивалент Win32, функцию <a href="http://msdn.microsoft.com/en-us/library/aa366537.aspx" rel="nofollow noreferrer">CreateFileMapping()</a>.

0 голосов
/ 07 апреля 2009

Вы можете легко написать свой собственный инструмент. Если это в самом начале, то подойдет любой грубый подход. Просто продолжайте сканирование, пока не найдете его.

Однако избежать записи на диск можно только в том случае, если вы не измените размер файла. Если вы хотите удалить или вставить байты где-то посередине, вам придется перезаписать все, что следует за ними. Который в вашем случае будет практически весь файл. Так что вам придется заменить его пробелами. Пока вы просто заменяете один байт другим, служебных данных не будет.

...