使用http.jl.发送一个大文件



我想用http.jl和Julia实现服务器。经过一定的计算后,服务器将返回一个"大"文件(大约100 MB(。我想避免必须读取内存中的所有文件,然后将其发送给客户端。

某个框架允许对此具有特定功能(例如烧瓶http://flask.pocoo.org/docs/0.12/api/#flask.send_file(或允许将内容流式传输到客户端(http://flask.pocoo.org/docs/0.12/patterns/streaming/peraming/) .

在http.jl中也可以使用这两个选项吗?或其他任何朱莉娅网络包?

这是一个读取文件testfile.txt的测试代码,但我想避免将完整的文件加载到内存中。

import HTTP
f = open("testfile.txt","w")
write(f,"test")
close(f)
router = HTTP.Router()
function testfun(req::HTTP.Request)  
  f = open("testfile.txt")
  data = read(f)
  close(f)
  return HTTP.Response(200,data)
end
HTTP.register!(router, "GET", "/testfun",HTTP.HandlerFunction(testfun))
server = HTTP.Servers.Server(router)
task = @async HTTP.serve(server, ip"127.0.0.1", 8000; verbose=false)
sleep(1.0)
req = HTTP.request("GET","http://127.0.0.1:8000/testfun/")
# end server
put!(server.in, HTTP.Servers.KILL)
@show String(req.body)

您可以使用内存映射的io:

function testfun(req::HTTP.Request)
    data = Mmap.mmap(open("testfile.txt"), Array{UInt8,1})
    return HTTP.Response(200,data)
end

data现在看起来像是朱莉娅的普通字节数组,但实际上对文件感到喜欢,这可能正是您想要的。该文件将在垃圾收集时关闭 - 如果您有很多请求并且没有触发垃圾收集,则可能最终得到很多开放文件。如果您的请求需要很长时间,则可以考虑在请求开始时致电GC((。

相关内容

最新更新