我正在 Go 中实现视频流服务器。 我目前使用的是标准 fileserver但我不确定它对大文件 (4GB+) 是否有效。
有没有一种方法可以在 Go 中有效地提供大文件?
最佳答案
我不确定你所说的“高效”是什么意思,所以我假设你的意思是大文件是流式传输而不是缓冲。
标准http.FileServer
最终使用the serveContent
function写入数据,这需要一个 io.ReadSeeker
作为内容(幸运的是文件就是这样)。
然后使用 io.Copy
复制内容,在一般情况下(虽然可能不是您的常见情况,请参见下文)表示 copyBuffer
.将使用 32KB 缓冲区。
因此,假设 http.ResponseWriter
的实现不缓冲其输入(it doesn't,另请参见 chunked writer),内存利用率应该是恒定的。
然而,当编写器支持ReadFrom
方法时,io.Copy
will use that instead .因为http.response
(ResponseWriter
接口(interface)的标准实现)implements the ReadFrom method , 它将被用来代替 copyBuffer
。此实现反过来将尝试在可能的情况下使用 sendfile
系统调用(如 os.File
的情况),这是更有效的含义(数据不根本不需要通过进程内存空间,所以尽可能好。
换句话说,我认为可以说内置的 net/http
包已经支持大文件的高效流式传输。
关于video - 从 go 服务器有效地流式传输大文件(视频),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42318795/