Эффективный оперативный поиск и замена больших файлов.
-
05-09-2019 - |
Вопрос
Для этого есть несколько стандартных инструментов, но мне нужен простой графический интерфейс, чтобы помочь некоторым пользователям (в Windows).Они получат диалоговое окно открытия файла и выберут файл для обработки.
Файл будет XML-файлом.Файл будет содержать (в первых нескольких строках) текстовую строку, которую необходимо удалить или заменить пробелами (неважно, какие именно).
Проблема в том, что размер XML-файла составляет несколько гигабайт, но фиксированная строка поиска и замены будет происходить в пределах первых 4 КБ или около того.
Каков наилучший способ перезаписать строку поиска и сохранить ее на месте, не требуя чтения всего объема в память или чрезмерной записи на диск?
Решение
Очевидно, что замена пробелами, чтобы размер файла в целом не менялся, является лучшим выбором здесь, в противном случае вам придется проходить через весь файл для обновления на диске.
Если бы это было для среды Unix, я бы рассмотрел возможность использования mmap()
чтобы сопоставить подходящую часть начала файла с оперативной памятью, затем отредактировать его на месте и готово.
Этот фрагмент показывает, как использовать эквивалент Win32, СоздатьСопоставлениеФайлов()
функция.
Другие советы
Вы можете легко написать свой собственный инструмент.Если это в самом начале, то подойдет любой брутфорс.Просто продолжайте сканирование, пока не найдете его.
Однако избежать большого количества операций записи на диск можно только в том случае, если вы не меняете размер файла.Если вы хотите удалить или вставить байты где-то посередине, вам придется перезаписать все, что следует за ними.В вашем случае это будет практически весь файл.Поэтому вам придется заменить его пробелами.Пока вы просто заменяете один байт другим, накладных расходов не будет.