Ввод из любого файла в приложении WPF очень медленный - PullRequest
1 голос
/ 05 августа 2020

У меня есть приложение WPF, которое принимает путь к входному файлу от пользователя, а затем на бэкэнде открывает текстовый файл и пытается прочитать один символ из файла.

        fs = File.OpenRead(fileName);
        var sr = new StreamReader(fs);

        int c;
        while ((c = sr.Read()) != -1) 
        { 
            Console.Write((char)c); //to check character read from file
            try
            {
                frequencyMap.Add((char)c, 1); 
            }
            catch
            {
                frequencyMap[(char)c] += 1;
            }
        }

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

введите описание изображения здесь

Выбранная область является частью ввода из файла. Файлы размером до 2 КБ хороши, но чтение из таких файлов, как 20 КБ, действительно вызывает трудности.

Теперь я прочитал, что использование потоков может решить эту проблему, я просто не знаю, как.

Мой вопрос: как я могу быстро читать данные из файлов? если использование потоков - это решение, то как его реализовать?

Я новичок в этом, поэтому любезно помогите мне. Спасибо

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Не читайте его по символам, читайте, например, по строкам и обрабатывайте каждую строку в al oop. Также Exception не позволяет проверить, существует ли ключ в Словаре.

using (var sr = new StreamReader(fileName))
{
    while (!sr.EndOfStream) 
    {
        string s = sr.ReadLine();
        Debug.WriteLine(s); //to check string read from file
        foreach (char c in s)
        {
            if (frequencyMap.ContainsKey(c))
                frequencyMap[c]++;
            else
                frequencyMap.Add(c, 1); 
        }
    }
}
1 голос
/ 05 августа 2020

Во-первых, я надеюсь, что Console.WrieLine - чисто тестовый код. Запись в консоль для каждого символа значительно замедлит вашу обработку.

Во-вторых, из скриншота, которым вы поделились, видно, что ваше приложение выдает много исключений. Создание исключений также обходится недешево в ограниченном l oop.

В-третьих, я бы порекомендовал вам профилировать ваше приложение (Visual Studio предоставляет профилировщик), чтобы помочь вам точно указать, где именно ваше приложение тратит свое время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...