Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
16.05.2017, 12:45
|
|||
---|---|---|---|
Не получается распараллелить Task |
|||
#18+
Всем привет, пишу парсинг курсов ЦБ, и нужно реализовать метод массового получения курсов за определенный временной интервал. Распараллелил этот процесс, чтобы ускорить его, однако по скорости выполнения получается точно также, как и и через последовательное выполение. Подсажите плиз, что не так. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
16.05.2017, 13:39
|
|||
---|---|---|---|
Не получается распараллелить Task |
|||
#18+
vb_sub Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
Зачем два раза дергать одно и то же? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
16.05.2017, 14:05
|
|||
---|---|---|---|
Не получается распараллелить Task |
|||
#18+
Pallaris, конечно дергать 2 раза не надо- при написании сообщения на форум лишнее раскоментировал. При контрольном замере использовал одиночный вызов метода ReadXmlValueAsyncTask(s). Для замера использовал время выполнения между брекпоинтами. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
16.05.2017, 17:15
|
|||
---|---|---|---|
Не получается распараллелить Task |
|||
#18+
Честно говоря не знал, что XmlReader может напрямую с urla забирать xmlины. Ну лично я не вижу, почему оно не идет быстрее. Может, сервер не дает спамить запросы? Для замера времени лучше пользовать Stopwatch Можно попробовать по-другому - параллельно скачивать xmlины, и по получении парсить. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
16.05.2017, 17:58
|
|||
---|---|---|---|
Не получается распараллелить Task |
|||
#18+
vb_sub, vb_sub Код: c# 1. 2.
Ничего не понимаю. Где у тя последовательный вариант загрузки? Чем он принципильно отличается? То что в первом запуск через ForEach? Ты же вызываешь тот же метод, который асинхронный. Стандартный вопрос: Понимаешь ли разницу между многопоточностью и асинхронностью? Если понимаешь, то пожалуйста, объясни, в чем принципиально различие первого кода и второго. Где ты хотел выиграть время? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
16.05.2017, 18:30
|
|||
---|---|---|---|
Не получается распараллелить Task |
|||
#18+
ЕМНИП у Рихтера что-то было про встроенные ограничения на одновременное скачивание. Т.е. хоть 100 страниц качай параллельно - все-равно они по очереди будут качаться. И как лечить вроде тоже было написано. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
16.05.2017, 20:31
|
|||
---|---|---|---|
Не получается распараллелить Task |
|||
#18+
refreg, если в кратце, то асинхронный вызов, когда код выполнения не дожидается окончания задачи и выходит из метода, если задача не завершена сразу, и продолжает свое выполнение. Когда await задача завершена, то код выполнения возвращается к ней. Многопоточность- когда я одновременно создаю несколько экземпляров выполняющие определенную работу (в конкретном примере List задач (Task))-по теории эти задачи должны быть распараллелены по процессорам и выполняться независимо друг от друга. То что Вы видите использования асинхронных методов в коде- это не на них я хотел распараллелить обработку, а за счет Parallel.ForEach. Вообще на данную мысль меня натолкнуло видео ... |
|||
:
Нравится:
Не нравится:
|
|||
|
16.05.2017, 20:33
|
|||
---|---|---|---|
Не получается распараллелить Task |
|||
#18+
Dima T, ну если 100 разных компьютеров одновременно запросят курс у ЦБ- вряд ли они будут в одной очереди выполнения. Или Вы считаете, что у них ограничение клиентов на ip? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
16.05.2017, 20:48
|
|||
---|---|---|---|
Не получается распараллелить Task |
|||
#18+
vb_subDima T, ну если 100 разных компьютеров одновременно запросят курс у ЦБ- вряд ли они будут в одной очереди выполнения. Или Вы считаете, что у них ограничение клиентов на ip? Не, там речь была про ограничения внутри одного процесса. При чем тут 100 разных компьютеров? Изначально один процесс в вопросе. Ограничение от .Net, а не ЦБ. Может путаю, но вроде так и пути обхода описаны. Лень перечитывать, Рихтера почитай . ... |
|||
:
Нравится:
Не нравится:
|
|||
|
17.05.2017, 11:58
|
|||
---|---|---|---|
|
|||
Не получается распараллелить Task |
|||
#18+
vb_sub, как тут уже выше подметили, у вас нет распараллеливания, все вызовы идут последовательно. Вам необходимо формировать Task и делать что-то типа Task.Run(...) Task[] tasks = new Task[количество задач]; После чего формируешь эти задачи и запускаешь. Вот тогда они будут идти параллельно. ВОт тут хорошо написано Limit The Number Of C# Tasks That Run In Parallel Я делал подобное только с сайтом росреестра. Вместо 15и часов последовательного выгребания, в 10 потоков выгребало всё за 2.5 часа. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
17.05.2017, 18:54
|
|||
---|---|---|---|
Не получается распараллелить Task |
|||
#18+
Lev Liminvb_sub, как тут уже выше подметили, у вас нет распараллеливания, все вызовы идут последовательно.Я думаю, что оба варианта идут параллельно. Поэтому и нет разницы. Точнее можно сказать, посмотреть что скрывается за AsyncContext.Run И, на всякий случай, цитата с сайта, который делает весь код бессмысленным (хотя, если смысл поупражняться, то это всегда полезно): cbr.ruExample 2 Пример получения динамики котировок доллара США: www.cbr.ru/scripts/XML_dynamic.asp? date_req1 =02/03/2001& date_req2 =14/03/2001&VAL_NM_RQ=R01235 date_req1 - date_req2 = Date range VAL_NM_RQ - unique code (you can get this code from Example 1) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
18.05.2017, 08:02
|
|||
---|---|---|---|
Не получается распараллелить Task |
|||
#18+
При росте числа потоков растет время на организацию их запуска. Оптимальное количество одновременно работающих потоков можно выявить для конкретной машины и конкретной задачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
18.05.2017, 12:03
|
|||
---|---|---|---|
Не получается распараллелить Task |
|||
#18+
Cat2, количество потоков= количество процессоров? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
18.05.2017, 12:52
|
|||
---|---|---|---|
|
|||
Не получается распараллелить Task |
|||
#18+
vb_subCat2, количество потоков= количество процессоров? сумарное количество ядер\конвееров процессоров, ты не учитываешь тот факт, что в 1ин момент времени поток может ничего не делать, + в системе есть кучи другого говна которые будут прерывать твои потоки. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
19.05.2017, 20:42
|
|||
---|---|---|---|
Не получается распараллелить Task |
|||
#18+
vb_subCat2, количество потоков= количество процессоров? Нет. Не факт что ось равномерно разобьет процессы по ядрам. На других ядрах в это время и другие задачи выполняются и ось может решить, что все должно выполнится на одном ядре. Когда пишешь на LINQ asParalel, то там реально выбирается почти оптимальный баланс процессоров, потому что какой-то план использования строится, а когда сам запускаешь потоки - то это лотерея. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
19.05.2017, 21:41
|
|||
---|---|---|---|
|
|||
Не получается распараллелить Task |
|||
#18+
Cat2, всё зависит от того, какая задача многопоточного выполнения перед вами стоит, вот и всё, Linq далеко не всё решается удобно. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
20.05.2017, 08:32
|
|||
---|---|---|---|
Не получается распараллелить Task |
|||
#18+
Roman MejtesCat2, всё зависит от того, какая задача многопоточного выполнения перед вами стоит, вот и всё, Linq далеко не всё решается удобно. Разумеется не всегда везет. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
26.05.2017, 09:24
|
|||
---|---|---|---|
Не получается распараллелить Task |
|||
#18+
Чтобы не плодить темы, закину сюда. В общем есть метод, который получает в имя текстового файла, потом его построчно читает и на каждую строчку выполняет команду. В файле порядка 500 строчек, соответственно генерируется 500 задач. Но все равно в сравнении с использованием простого чтения (без создания задача) получается по времени или также или дольше. Подскажите плиз, что неверно в распараллеливании. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171.
При однопоточном выполении 26 мс, при "многопоточном"- 45. Я подозреваю, что время на создание и обработку Taskов перекрывает весь выйгрыш от многопоточности, то тогда какого правила придерживаться? Создавать таски, только если их количесвто меньше количества процессоров? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
26.05.2017, 10:19
|
|||
---|---|---|---|
Не получается распараллелить Task |
|||
#18+
vb_sub Код: c# 1.
И где у тя параллельная обработка? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
26.05.2017, 11:43
|
|||
---|---|---|---|
Не получается распараллелить Task |
|||
#18+
vb_subПри однопоточном выполении 26 мс, при "многопоточном"- 45. Я подозреваю, что время на создание и обработку Taskов перекрывает весь выйгрыш от многопоточности, то тогда какого правила придерживаться? Создавать таски, только если их количесвто меньше количества процессоров? У тебя выводы как в анекдотеОпыт 1-й: берем таракана, отрываем ему 2-е ноги, свистим таракан убегает! Опыт 2-й: берем отрываем таракану еще 2-е ноги, свистим таракан убегает! Опыт 3-й: берем отрываем таракану последние ноги, свистим таракан стоит! Вывод: таракан без ног не слышит! Твои таски последовательно выполняются, см. пост выше. Но и это не тормоз. Тормоз у тебя в работе с БД. Уменьши количество обращений к БД до минимума, в идеале до одного. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
26.05.2017, 11:53
|
|||
---|---|---|---|
Не получается распараллелить Task |
|||
#18+
Dima T, изначально было без lock, но в листе tasks тогда появлялась задача null и код падал с ошибкой "Массив задач включал по меньшей мере один неопределенный (null) элемент"- хз откуда ему там появляться. Dima T Тормоз у тебя в работе с БД. Уменьши количество обращений к БД до минимума что-то вроде bulk update? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
26.05.2017, 11:57
|
|||
---|---|---|---|
Не получается распараллелить Task |
|||
#18+
vb_subВ общем есть метод, который получает в имя текстового файла, потом его построчно читает и на каждую строчку выполняет команду. Тут нужен классический producer-consumer (производитель-потребитель): один поток читает данные и передаёт дальше; второй поток обрабатывает данные; третий поток пишет их в базу. В современном .NET это сверхудобно делается конвейером ( Pipelines ). Итого, это может выглядеть как-то так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42.
Потом нужно разобраться, какая именно из этих трёх стадий наиболее затратна, её и параллелить. Чтение с диска параллелить смысла нет: физический носитель один, всё ограничено его скоростью работы. Запись в базу, аналогично, скорей всего, параллелить смысла нет. Разве что перейти на BULK INSERT . А вот среднюю стадию можно попробовать ускорить. Применить либо Parallel.ForEach, либо AsParallel(). vb_subЯ подозреваю, что время на создание и обработку Taskов перекрывает весь выйгрыш от многопоточности Именно! Если тело задачи выполняется очень быстро, то затраты на её создание превысят выгоды. В таком случае нужно в каждой задаче обрабатывать не один элемент, а диапазон. Тут нужно смотреть в сторону Partitioner.Create - метод разбивает последовательность на диапазон значений, каждый из которых передаём на выполнение таскам. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
26.05.2017, 11:58
|
|||
---|---|---|---|
Не получается распараллелить Task |
|||
#18+
Хотя бы убери установку соединения с БД перед каждым запросом. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61.
И многопоточность тут не нужна, т.к. код простой и затраты на создание таска превышают всю пользу от распараллеливания. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
26.05.2017, 12:57
|
|||
---|---|---|---|
Не получается распараллелить Task |
|||
#18+
Dima TИ многопоточность тут не нужна, т.к. код простой и затраты на создание таска превышают всю пользу от распараллеливания. Параллельная запись в БД - это бред. Как и парсинг. Единственный процесс, который имеет смысл распараллеливать - собственно скачивание. И замерять нужно его, а не все подряд. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
26.05.2017, 13:38
|
|||
---|---|---|---|
Не получается распараллелить Task |
|||
#18+
Народ пишет ответы кто на первый вопрос, кто на второй. Автора самого бы надо "распараллелить" за то, что не задал второй вопрос отдельной темой. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=20&mobile=1&tid=1399877]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
42ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 166ms |
0 / 0 |