Каков оптимальный (скоростной) способ анализа большого (> 4 ГБ) текстового файла с множеством (миллионов) строк? - PullRequest
6 голосов
/ 06 января 2009

Я пытаюсь определить, какой самый быстрый способ прочитать большие текстовые файлы с большим количеством строк, выполнить некоторую обработку и записать их в новый файл. В C # /. Net кажется, что StreamReader - это, казалось бы, быстрый способ сделать это, но когда я пытаюсь использовать этот файл (чтение построчно), он идет примерно на 1/3 скорости ввода-вывода Python (что меня беспокоит потому что я продолжаю слышать, что ввод-вывод Python 2.6 был относительно медленным).

Если для этого нет более быстрого решения .Net, можно ли написать решение быстрее, чем StreamReader, или оно уже использует сложный буфер / алгоритм / оптимизации, которые я бы никогда не надеялся побить?

Ответы [ 7 ]

3 голосов
/ 06 января 2009

У вас есть пример кода того, что вы делаете, или формат файла, который вы читаете?

Еще один хороший вопрос: сколько потоков вы храните в памяти за раз?

2 голосов
/ 06 января 2009

Если ваш собственный код проверяет один символ за раз, вы хотите использовать sentinel , чтобы отметить конец буфера или конец файла, чтобы у вас был только один тест в вашем внутреннем цикле . В вашем случае это один тест для конца строки, поэтому вы захотите временно вставить новую строку в конце каждого буфера, например.

Статья в Википедии о стражах вообще не помогает; это не описывает этот случай. Вы можете найти описание в любом из учебников алгоритмов Роберта Седжвика.

Возможно, вы также захотите взглянуть на re2c, который может генерировать очень быстрый код для сканирования текстовых данных. Он генерирует код на C, но вы можете его адаптировать, и вы, безусловно, можете изучить методы, прочитав их статью о re2c.

2 голосов
/ 06 января 2009

StreamReader довольно хорош - как вы читали его на Python? Возможно, что если вы укажете более простую кодировку (например, ASCII), это может ускорить процесс. Сколько процессора занимает процесс?

Вы можете увеличить размер буфера, используя соответствующий конструктор StreamReader, но я не знаю, насколько это может измениться.

0 голосов
/ 06 января 2009

Размеры буфера по умолчанию, используемые StreamReader / FileStream, могут быть не оптимальными для длин записей в ваших данных, поэтому вы можете попробовать настроить их. Вы можете переопределить длину буфера по умолчанию в конструкторах как для FileStream, так и для StreamReader, который его оборачивает. Вы, вероятно, должны сделать их одинакового размера.

0 голосов
/ 06 января 2009

Попробуйте BufferedReader и BufferedWriter для ускорения обработки.

0 голосов
/ 06 января 2009

Извините, если я не гуру .NET, но в C / C ++, если у вас есть хорошие большие буферы, вы сможете анализировать его с помощью LL1-анализатора, не намного медленнее, чем вы можете сканировать байты. Я могу дать более подробную информацию, если вы хотите.

0 голосов
/ 06 января 2009

Общее примечание:

  1. Высокопроизводительная потоковая передача не сложна. Вы обычно должны изменить логику, которая использует потоковые данные; это сложно.

На самом деле, все.

...