使用HTTP.jl发送大文件

时间:2018-02-26 13:29:21

标签: http stream julia sendfile

我想用HTTP.jl和julia实现一个服务器。经过一些计算后,服务器将返回一个“大”文件(大约几百MB)。我想避免阅读内存中的所有文件,然后将其发送给客户端。

某些框架允许为此设置特定功能(例如Flask http://flask.pocoo.org/docs/0.12/api/#flask.send_file)或允许将内容流式传输到客户端(http://flask.pocoo.org/docs/0.12/patterns/streaming/)。

HTTP.jl中是否也提供了这两个选项?或任何其他Julia网络包?

这是一个读取文件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)

1 个答案:

答案 0 :(得分:1)

您可以像这样使用memory mapped IO

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

data现在看起来像是julia的正常字节数组,但实际上对文件很有用,这可能正是你想要的。垃圾收集时文件将被关闭 - 如果你有很多请求并且没有触发垃圾收集,你可能会得到很多打开的文件。如果您的请求需要很长时间,您可以考虑在请求开始时调用gc()。