StreamReader очень медленно для больших файлов C#
НЕТ, это не так. Если бы вы выполнили свою основную домашнюю работу по запуску профилировщика, вы увидите, что время, затрачиваемое вами, НЕ проводится в считывателе потоков.
текст + = (линия);
Эта строка создает новую строку. Для этого необходимо выделить новую память. Для большого файла это ЗНАЧИТЕЛЬНОЕ количество созданного мусора. И чем дольше это получается, тем больше операций копирования вы делаете.
Если это то, что вы используете его для
backgroundWorker1.ReportProgress (text.Length);
также бесполезно. Вы также можете иметь
Int textLength = 0
, что вы установите
textLength + = line.Length
без всяких манипуляций с текстом.
Вы ДОЛЖНЫ знать это. Проблемы с производительностью? НИКОГДА не предполагайте, ВСЕГДА мы профайлер, который очень быстро показал вам эту проблему. Это базовая отладка.
Некоторый фон математика, кстати:
(для файлов вокруг 500mb до 1Гба)
Это означает, что после загрузки 500MB данных вашего кода делают 500МБЫ (если файл был unicode) до 1gb (строка, удваивающая размер файла ascii) операция копирования PER LINE.
Возможно, вам захочется посмотреть скорость памяти вашего компьютера. В зависимости от сервера и т.д.вы можете ограничить до 50 гб в секунду (high end X99 - более новые DDR 4-памяти быстрее, но на рабочих станциях в общем случае гораздо меньше каналов, поэтому они медленнее), а копия считается двойной (чтение и запись). Это означает, что вы действительно начинаете работать с сценариями «копирование строки - это перегрузка их шины памяти».
Вы пробовали свой тест без конкатенации в 'System.String', то есть комментируете строку' text + = (line); '? –
Возможно, вы не хотите читать его в строке, но с фиксированной длиной буфера. – rinukkusu
@ Christian.K Я сделал это, и это было мгновенно. Теперь, как я могу получить текст? – jLynx