Сопоставление строки в большом текстовом файле?

У меня есть список строк, содержащий около 7 миллионов элементов в текстовом файле размером 152 МБ. Мне было интересно, как лучше всего реализовать функцию a, которая принимает одну строку и возвращает, находится ли она в этом списке строк.


person Tasawer Khan    schedule 19.04.2010    source источник


Ответы (2)


Вам придется сопоставлять этот текстовый файл несколько раз? Если это так, я бы создал файл HashSet<string>. В противном случае просто прочитайте его построчно (я предполагаю, что в каждой строке есть одна строка) и посмотрите, совпадает ли он.

152 МБ ASCII в конечном итоге превратятся в более чем 300 МБ данных Unicode в памяти, но на современных машинах достаточно памяти, поэтому сохранение всей партии в HashSet<string> действительно сделает повторные поиски очень быстрыми.

Абсолютно самый простой способ сделать это, вероятно, использовать File.ReadAllLines, хотя это создаст массив, который затем будет отброшен - не очень хорошо для использования памяти, но, вероятно, не так уж плохо:

HashSet<string> strings = new HashSet<string>(File.ReadAllLines("data.txt"));
...

if (strings.Contains(stringToCheck))
{
    ...
}
person Jon Skeet    schedule 19.04.2010
comment
На самом деле мне приходится искать снова и снова. Но я собираюсь использовать это в веб-приложении. Станет ли память проблемой при большом количестве запросов? - person Tasawer Khan; 19.04.2010
comment
@Taz: количество запросов не имеет значения, если вы создаете свою хеш-карту только один раз :) Согласно документации: Любые общедоступные статические члены этого типа являются потокобезопасными, так что здесь нет проблем, слишком - person tanascius; 19.04.2010
comment
@Taz: танаскиус прав. Загрузите его один раз, и вы сможете выполнять поиск (даже с использованием нескольких одновременных потоков — до тех пор, пока в него ничего не записывается) без дополнительного использования памяти. Пока на вашем веб-сервере достаточно памяти для хранения набора, это правильный путь. - person Jon Skeet; 19.04.2010
comment
что бы вы порекомендовали для огромных файлов размером более 2 ГБ? Загружать частичные данные за один раз? - person Nayan; 19.04.2010
comment
@Nayan: Используйте правильную базу данных! - person Jon Skeet; 19.04.2010

Зависит от того, что вы хотите сделать. Если вы хотите повторять поиск совпадений снова и снова, я загружаю весь файл в память (в HashSet). Там очень легко искать совпадения.

person tanascius    schedule 19.04.2010