Имеет ли смысл использовать MemoryMappedFile для поиска больших текстовых файлов? - PullRequest
2 голосов
/ 18 июля 2011

Мне поручено реализовать функцию поиска, которая будет искать по нескольким большим (пару МБ) файлам журнала и возвращать строки, содержащие ключевые слова. Файлы журнала постоянно добавляются в пул, поэтому поиск должен быть динамическим каждый раз.

Имеет ли смысл создавать MemoryMappedFile для каждого файла, а затем выполнять итерацию по каждой строке в соответствии с ключевыми словами? Если нет, то что может быть лучше?

Любые ссылки на пример кода будут высоко оценены.

Ответы [ 2 ]

1 голос
/ 18 июля 2011

Да.А «пара МБ» не очень много, она легко умещается в 2 ГБ.

Вы захотите использовать конструктор , который принимает размер отображения , поскольку файл будет со временем увеличиваться.Кроме того, я думаю, вам нужно будет заново создавать Accessor или Stream при каждом поиске, но я нахожу здесь немного неясным MSDN.

С Stream очень просто создать StreamReader и прочитать каждую строку.Весь процесс, скорее всего, связан с вводом-выводом на разумном оборудовании, поэтому сначала не беспокойтесь об оптимизации процессора.

1 голос
/ 18 июля 2011

Почему бы просто не создать правильно структурированное дерево объектов индекса в памяти, оптимизированное для поиска?

РЕДАКТИРОВАТЬ: Добавлено после некоторых комментариев ...

Может быть что-токак это:

class Index
{
    public Dictionary<string, List<SourceFile>> FilesThatContainThisWord {get; set;}
    ...
}


class SourceFile
{
    public string Path {get; set;}
    ...
}


// Code to look up a term
var filesThatContainMonday = myIndex.FilesThatContainThisWord["Monday"];
...