парсинг больших строк данных приводит к высокой загрузке процессора - PullRequest
2 голосов
/ 21 марта 2011

Моему приложению необходимо проанализировать некоторые большие строковые данные.Это означает, что я активно использую методы Split, IndexOf и SubString класса string.Я пытаюсь использовать класс StringBuilder везде, где мне нужно сделать любое объединение.Однако, когда приложение выполняет этот анализ, загрузка процессора приложения становится высокой (60-70%).Я предполагаю, что вызов этих строковых API-интерфейсов является причиной высокой загрузки ЦП, в частности, большой размер данных (типичная длина строки - 400 КБ).Любые идеи, как я могу проверить, что заставляет использование процессора идти так высоко, а также если есть какие-либо предложения о том, как снизить использование процессора?

Ответы [ 3 ]

2 голосов
/ 21 марта 2011

Чтобы узнать, откуда исходит загрузка ЦП: см. Что такое хорошие профилировщики .NET?

Чтобы уменьшить использование процессора: конечно, это зависит от того, что на самом деле занимает время. Вы можете, например, рассмотреть возможность работы не с реальными подстроками, а с небольшими объектами, кодирующими, где они находятся в пределах больших строк, из которых они получены. (Нет никаких гарантий, что это действительно будет улучшением.) Очень вероятно, что когда вы профилируете свой код, будет несколько вещей, которые будут вызывать у вас проблемы; они вполне могут быть вещами, о которых вы никогда не догадались, и их может быть очень легко исправить, как только вы узнаете, что они нуждаются в исправлении.

2 голосов
/ 21 марта 2011

Одна вещь, которую нужно проверить, это то, что вы передаете StringBuilder столько, сколько возможно, вместо того, чтобы создавать новый, а затем возвращать его ToString () без необходимости.

Гораздо больший выигрыш можно получить, еслиВы обрабатываете данные как строки меньшего размера, читаемые из потока.Конечно, это зависит только от того, какие манипуляции вы делаете, но, если это вообще возможно, прочитайте ваши данные из StreamReader (или аналогичного в зависимости от источника) небольшими порциями, а затем запишите их в StreamWriter.

Часто изменения применяются только в пределах заданной строки текста, что делает следующий шаблон незамедлительно полезным:

using(StreamReader sr = new StreamReader(sourceInfo))
using(StreamWriter sw = new StreamWriter(destInfo))
  for(string line = sr.ReadLine(); line != null; line = sr.ReadLine())
    sw.WriteLine(ManipulateString(line));

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

1 голос
/ 21 марта 2011

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

//Create a StringReader using the String variable data which has your String in it
//A StringReader is just a TextReader implementation for Strings
StringReader reader = new StringReader(data);

//Now do whatever manipulation on the string you want...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...