从go服务器高效地流式传输大型文件(视频)

时间:2017-02-18 18:06:09

标签: video go server stream

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

有没有办法在Go中有效地提供大文件?

1 个答案:

答案 0 :(得分:2)

我不确定你的意思"有效"所以我假设你的意思是大型文件是流式的而不是缓冲的。

标准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的情况),这是一个更有效的意义(数据不必经过处理内存空间,所以一样好。)

换句话说,我认为内置controlsModule.directive('myTextbox', ['$interpolate',function ($interpolate) { var tmpl = '<div class="form-group" title="{{hint}}"> \ <label class="{{labelClass}} control-label">{{label}}</label> \ <input type="{{type}}" class="form-control input-group-sm" {{attributesToCopy}} /> \ </div>'; var interpolate = $interpolate(tmpl); function buildModel(attrs) { if (!attrs.placeholder) attrs.placeholder = attrs.label; if (!attrs.labelClass) attrs.labelClass = "col-sm-3"; if (!attrs.type) attrs.type = "text"; return { label: attrs.label, labelClass: attrs.labelClass, type: attrs.type }; } function template(tElement, tAttrs) { var model = buildModel(tAttrs); var atc = ""; for (var attr in tAttrs) { if (!(attr.lastIndexOf('$', 0) === 0) && tAttrs.hasOwnProperty(attr) && !model[attr]) { atc += ' ' + _.kebabCase(attr); //converts to snake_case , uses lodash/uderscore if (tAttrs[attr] !== attr) { atc += '="' + tAttrs[attr] + '" '; } } } model.attributesToCopy = atc; return interpolate(model); } return { restrict: 'EA', template: template }; }]); 包已经支持高效的大型文件流传输是合理的。