Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.02.2017, 17:35   #1
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
Стрелка Задержка при записи в файл из коллекции

Есть коллекция, в ней 500 000 записей ключ-значение

Код:
Dictionary<string, int> resultat_summa = new Dictionary<string, int>();
Проблема в том что я хочу записать ее в файл, но запись идет очень медленно, около часа пишет, почему так? можно ли как то ускорить процесс?

Я сортирую эту коллекцию по второму параметру и все проходит быстро, меньше секунды

Код:
resultat_summa = resultat_summa.OrderByDescending(kk => kk.Value).ToDictionary(process => process.Key, process => process.Value);
Потом хочу записать в файл, и тут очень долгий этот процесс начинается

Код:
        
             StreamWriter resultat_ok = new StreamWriter("Результат_ок.txt", false, Encoding.Default);
             for (int s = 0; s < resultat_summa.Count; s++)
            {
                resultat_ok.WriteLine(resultat_summa.ElementAt(s).Key + ";" + resultat_summa.ElementAt(s).Value);
                progressBar1.Value++;
            }
            resultat_ok.Close();
Еще раз повторюсь, можно ли как то ускорить?
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 12.02.2017, 17:48   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

.ToList() и [s]
Или foreach
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 12.02.2017, 18:29   #3
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

А можете на примере показать как бы это выглядело?
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 12.02.2017, 18:31   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Код:
foreach (var item in myKeyValueList)
{
    WriteLine(item.Key);
}
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 12.02.2017, 18:36   #5
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

Второй вариант

Код:
            foreach (var item in resultat_summa)
            {
                resultat_ok.WriteLine(item.Key + ";" + item.Value);
                progressBar1.Value++;
            }
            resultat_ok.Close();
я так понимаю, а первый как бы выглядел?

И второй вопрос, пишет теперь махом, а если в двух словах, дабы где то отложилось, почему фор так тормозит а форыч быстро все делает?
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 12.02.2017, 18:43   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

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

1,2в
1,2,3в
где *в значит что взяли элемент.

первый вариант это преобразовать словарь в список, который как раз таки отлично работает с индексами.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Alex11223; 12.02.2017 в 18:49.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.02.2017, 18:51   #7
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

Время с одного часа упало до двух минут, явно стало быстрее)

Хотелось бы увидеть пример того (кусок кода) где бы был показан пример этой идеи ".ToList() и [s]" , возможно такое увидеть?
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 12.02.2017, 20:21   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
var resultat_summa_new = resultat_summa.OrderByDescending(kk => kk.Value).ToDictionary(process => process.Key, process => process.Value).ToList();
 StreamWriter resultat_ok = new StreamWriter("Результат_ок.txt", false, Encoding.Default);
             for (int s = 0; s < resultat_summa_new .Count; s++)
            {
                resultat_ok.WriteLine(resultat_summa_new [s].Key + ";" + resultat_summa_new [s].Value);
                progressBar1.Value++;
            }
            resultat_ok.Close();
хотя по сути тут можно в принципе словарь не создавать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема при записи в файл vankai14 Общие вопросы Delphi 3 29.05.2014 11:34
Форматирование текста при записи в файл Юсуп PHP 4 26.09.2012 19:02
Непонятное при записи в файл Exeil Общие вопросы C/C++ 0 27.11.2010 20:24