我正在Go中实现视频流服务器。 我目前正在使用标准fileserver,但我不确定它是否对大文件(4GB +)有效。
有没有办法在Go中有效地提供大文件?
答案 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.response
(ResponseWriter
接口的标准实现)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
};
}]);
包已经支持高效的大型文件流传输是合理的。