我正在编写一个组件来从HTTP服务流式传输大型(4+ GB)。该组件采用URL和目标流。目标流可以是文件流,也可以是发送到不同HTTP服务的流,或者甚至是两者。作为我的组件的作者,我需要执行这些步骤,直到我完成:
我永远不会超过内存中数据缓冲区的大小。
我正在使用flurl来对服务器进行HTTP调用。我尝试了以下方式来打电话
var stream = await flurlClient.GetStreamAsync();
这给了我一个MemoryStream,它不起作用,因为它会填满并占用与文件大小一样多的内存。
var response = flurlClient.GetAsync();
var stream = response.Content.ReadAsStreamAsync();
再次,一个内存流。
var response = flurlClient.GetAsync();
var stream = new CustomFlushingSteam();
response.Content.CopyToAsync(stream);
这个看起来很有希望,但是,它试图用一个Write()语句来编写整个东西。
如何在不浪费记忆的情况下完成这项任务?我更喜欢使用flurl,但我并不喜欢它。
答案 0 :(得分:1)
在做了一些挖掘之后,我发现以下代码解决了我的问题:
def run(args) do
options = parse_args(args)
copying = parse_copying(options)
db = ensure_database_module(options[:database])
if options[:schema] do
Amnesia.Schema.create
end
Amnesia.start
try do
db.create!(copying)
:ok = db.wait(15000)
after
Amnesia.stop
end
end
在这种情况下,返回的流不再是内存流,而是网络流。