【发布时间】:2017-07-08 05:04:22
【问题描述】:
我正在用 Go 实现视频流服务器。 我目前使用的是标准fileserver,但我不确定它对大文件(4GB+)是否有效。
有没有办法在 Go 中高效地处理大文件?
【问题讨论】:
我正在用 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接口的标准实现)implements the ReadFrom method,所以会用它来代替copyBuffer。这个实现反过来会在可能的情况下尝试使用sendfile 系统调用(就像os.File 的情况一样),这是高效的更强含义(数据根本不必经过进程内存空间,尽可能好)。
换句话说,我认为内置的net/http包已经支持大文件的高效流传输是合理的。
【讨论】: