我必须从安全的 Web 服务器下载、处理和存储一个 8GB 的 XML 文件。我可以使用WebRequest
类下载文件,但这需要很长时间。另外,我知道该文件的结构使其适合离散块的处理。
我怎样才能“流式传输”这个文件,以便我只获得可以处理的小块,而不必一次获得整个流?
编辑
我忘了提 - 我们托管在 Azure 上。想到的一个想法是提供一个工作角色,它只下载大文件并且可以根据需要花费任意时间。这有多可行?
8 GB 是一个很大的工作负载。为了保护自己免于返工并有效扩展,我会将 XML 文件下载与其处理分离。
在作为流下载时,我会将某种流标识符写入持久存储,并通过将带有相关数据的消息放在队列中来安排每个原子工作单元完成。这将允许由于任何原因或工作单元不成功和/或干扰下载而从南下的下载中恢复。
我正在使用 HttpWebRequest、BeginGetResponse 然后 GetResponseStream
然后可以通过stream.BeginRead逐块读取流
这是一个太复杂的例子: http ://stuff.seans.com/2009/01/05/using-httpwebrequest-for-asynchronous-downloads/
如果您需要按顺序处理文件,只需在响应流上打开一个 XMLReader 并根据需要读取数据。
如果您需要随机访问文件(即在中间读取),您可能需要做更多的工作来创建可搜索的流(如果服务器在请求中支持 RANGE 选项)或者像现在一样简单地下载整个文件。
请注意,8GB 是大量数据,无论阅读方式如何,完全下载都会花费大量时间。
您可以将 xml 文件上传到块 blob 并从那里下载。这篇博文可能对http://blogs.msdn.com/b/kwill/archive/2011/05/30/asynchronous-parallel-block-blob有所帮助-transfers-with-progress-change-notification.aspx
希望这可以帮助。