Мне нужно создать программу на C #, которая хорошо справляется с чтением огромных файлов.
Например, у меня есть файл размером более 60 МБ. Я прочитал все это в коробку сцинтиллы, давайте назовем это sci_log. Программа использует примерно 200 МБ памяти с этой и другими функциями. Это все еще приемлемо (и меньше, чем объем памяти, используемый Notepad ++ для открытия этого файла).
У меня есть еще одна коробка для сцинтиллы, sci_splice. Пользователь вводит поисковый термин, и программа ищет файл (или sci_log, если длина файла достаточно мала - это не имеет значения, потому что это происходит в обоих направлениях), чтобы найти regexp.match. Когда он находит совпадение, он объединяет эту строку со строкой, которая имеет предыдущие совпадения, и увеличивает временную переменную count. Когда count равен 100 (или 150, или 200, на самом деле любое число), тогда я помещаю вывод в sci_splice, вызываю GC.Collect () и повторяю для следующих 100 строк (установка count = 0, обнуление строки).
У меня нет кода сейчас, когда я пишу это со своего домашнего ноутбука, но проблема в том, что он использует МНОГО памяти. Использование 200 мегабайт памяти увеличивается до 1 гб без конца. Это происходит только при поиске с большим количеством совпадений регулярных выражений, так что это что-то со строкой. Но проблема в том, не освободит ли ГК эту память? Кроме того, почему он поднимается так высоко? Не имеет смысла, почему это более чем в три раза (наихудший возможный случай). Даже если все эти 200 МБ были просто журналом в памяти, все, что он делает - читает каждую строку и сохраняет ее (в худшем случае).
После еще одного тестирования похоже, что что-то не так со Scintilla, использующим много памяти при добавлении строк. Первоначальное чтение строк имеет скачок памяти до 850 мБ за доли секунды. Думаю, мне нужно просто просмотреть страницу вывода.