Как асинхронно загрузить миллионы файлов из файлового хранилища? - PullRequest
0 голосов
/ 08 апреля 2020

Давайте предположим, что у меня есть база данных, управляющая миллионами документов, которые хранятся на сервере WebDav или SMB, который не поддерживает получение документов в больших объемах. Учитывая список (возможно, всех) идентификаторов документов, как мне загрузить соответствующие документы как можно быстрее?

Итерации по списку и последовательная их загрузка слишком медленны. 2 варианта, которые я вижу, - это потоки и asyn c загрузки.

Моя интуиция говорит, что asyn c программирование должно быть предпочтительнее потоков, потому что я просто жду ввода-вывода на стороне клиента. Но я довольно новичок в программировании asyn c и не знаю, как это сделать. Я предполагаю, что перебор всего списка и отправка асинхронного запроса на загрузку c потенциально может привести к слишком большому количеству запросов за очень короткое время, что приведет к отклонению запросов. Так, как я дросселирую это? Есть ли лучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Взгляните на это: Как ограничить количество одновременных асинхронных c I / O? Использование SemaphoreSlim, как предлагается в принятом ответе, простое и довольно хорошее решение.

Мой личный фаворит, хотя для такого рода заданий используется библиотека TPL Dataflow . Вы можете увидеть здесь пример использования этой библиотеки для асинхронной загрузки страниц из Интернета с настраиваемым уровнем параллелизма в сочетании с классом HttpClient. Здесь - другой пример.

0 голосов
/ 09 апреля 2020

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

...