2011-04-02 3 views
3

У меня есть файл, содержащий около 170 000 слов или около того. Каким будет лучший способ справиться с этим в .NET?C# Поиск через большой список слов

Имеет смысл загрузить его в список в памяти и выполнить поиск по списку. Будет ли список такого размера оставаться проблемой в памяти? Любые предложения относительно загрузки и поиска этого типа списка будут оценены.

Спасибо,

+0

Каков формат файла? Какое у вас самое длинное слово? –

+2

Какой поиск вы хотите выполнить? – spender

+0

Как насчет использования 'Regular Expression'? –

ответ

2

Имеет смысл загрузить его в список в памяти и выполнить поиск в списке. Будет ли список такого размера оставаться проблемой в памяти?

Если ваши слова не очень долго, память здесь не будет проблемой.

Если вы говорите об английском языке на стандартном латинском алфавите, тогда память не будет проблемой.

Но вы должны быть конкретными в отношении длины слова. Если вы имеете дело с, скажем, словами на {A, C, G, T}, и эти слова бывают ДНК, тогда да, память будет проблемой.

Любые предложения по загрузке и поиску этого типа списка будут оценены.

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

Ответ на этот последний вопрос во многом зависит от того, что именно вы делаете.

+0

Это файл csv, и я только пытаюсь найти совпадение по слову. –

+0

@ user689031: Насколько велики слова? Скорее всего, простой ответ заключается в том, чтобы прочитать их в «HashSet », а в тестах для совпадений используется «HashSet . Содержит». – jason

+0

Файл получен из «Enhanced North American Benchmark Lexicon», это словарь по существу. http://code.google.com/p/dotnetperls-controls/downloads/detail?name=enable1.txt&can=2&q= –

0

Загрузка весь список в память будет наиболее памяти интенсивные варианты, но самый быстрый один, а также.

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

Это выбор, который вы должны сделать для своего применения.

0

Anser, предложенный Джейсоном, является geat. Но имейте в виду, что никогда не делайте string.split на длинных строках. Эта функция имеет накладные расходы производительности на большой строке. И преступник для OOM.

Смежные вопросы