【问题标题】:efficiently stream large file (video) from go server从 Go 服务器有效地流式传输大文件(视频)
【发布时间】:2017-07-08 05:04:22
【问题描述】:

我正在用 Go 实现视频流服务器。 我目前使用的是标准fileserver,但我不确定它对大文件(4GB+)是否有效。

有没有办法在 Go 中高效地处理大文件?

【问题讨论】:

    标签: video go server stream


    【解决方案1】:

    我不确定你所说的“高效”是什么意思,所以我假设你的意思是大文件是流式传输的而不是缓冲的。

    标准的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.responseResponseWriter接口的标准实现)implements the ReadFrom method,所以会用它来代替copyBuffer。这个实现反过来会在可能的情况下尝试使用sendfile 系统调用(就像os.File 的情况一样),这是高效的更强含义(数据根本不必经过进程内存空间,尽可能好)。

    换句话说,我认为内置的net/http包已经支持大文件的高效流传输是合理的。

    【讨论】:

      猜你喜欢
      • 2018-05-13
      • 2019-02-25
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-02
      • 2013-12-26
      • 2012-10-02
      相关资源
      最近更新 更多