如何从文件存储异步下载数百万个文件?
How to asynchronically download millions of files from a file storage?
假设我有一个管理数百万文档的数据库,这些文档存储在不支持批量检索文档的 WebDav 或 SMB 服务器上。
给定一个(可能是所有)文档 ID 列表,我如何尽快下载相应的文档?
迭代列表并按顺序下载它们太慢了。
我看到的 2 个选项是线程和异步下载。
我的直觉说异步编程应该优于线程,因为我只是在客户端等待 IO。但是我对异步编程很陌生,我不知道该怎么做。
我假设遍历整个列表并发送异步下载请求可能会导致在很短的时间内请求过多,从而导致请求被拒绝。那么我该如何节流呢?是否有执行此操作的最佳实践方法?
看看这个:How to limit the amount of concurrent async I/O? Using a SemaphoreSlim
,如已接受的答案中所建议的,是一个简单且非常好的解决方案。
我个人最喜欢这种,如果工作是 TPL Dataflow library. You can see an example of using this library to download pages from the web asynchronously with a configurable level of concurrency, in combination with the HttpClient
class. Here 是另一个例子。
我还发现 this 很棒的文章,解释了 4 种不同的方式来限制并发下载的数量。
假设我有一个管理数百万文档的数据库,这些文档存储在不支持批量检索文档的 WebDav 或 SMB 服务器上。 给定一个(可能是所有)文档 ID 列表,我如何尽快下载相应的文档?
迭代列表并按顺序下载它们太慢了。 我看到的 2 个选项是线程和异步下载。
我的直觉说异步编程应该优于线程,因为我只是在客户端等待 IO。但是我对异步编程很陌生,我不知道该怎么做。 我假设遍历整个列表并发送异步下载请求可能会导致在很短的时间内请求过多,从而导致请求被拒绝。那么我该如何节流呢?是否有执行此操作的最佳实践方法?
看看这个:How to limit the amount of concurrent async I/O? Using a SemaphoreSlim
,如已接受的答案中所建议的,是一个简单且非常好的解决方案。
我个人最喜欢这种,如果工作是 TPL Dataflow library. You can see HttpClient
class. Here 是另一个例子。
我还发现 this 很棒的文章,解释了 4 种不同的方式来限制并发下载的数量。