我正在使用go从一台服务器下载文件,并在操作这些文件之后将其发送到另一台服务器。
文件大小可以从1MB到200 1MB不等。
目前,我的代码非常简单,我使用的是http.Client和bytes.Buffer。
处理大文件(100 is到200 is)需要花费大量的时间,而这些文件有很多。
在快速分析之后,我发现大多数情况下我做字节。(*缓冲器).grow,
例如,如何为16 big创建大缓冲区?
我能做些什么来提高代码的效率?处理大型http请求的一般提示?
编辑
我会解释,我到底想做什么。我有couchdb文档(带附件),我试图复制到另一个couchdb实例。couchdb文档大小可以在30 is到200 is之间,复制微小的(2-10 is) couchdb文档非常快。
但是把文件传送到电线上真的很慢。目前,我正在尝试配置文件,并尝试使用@Evan回答来了解我的问题所在。
发布于 2014-03-31 21:32:16
看看bytes.NewBuffer:http://golang.org/pkg/bytes/#NewBuffer的描述
听起来,您可以创建一个16 to字节的切片,并使用它初始化缓冲区。
发布于 2014-04-01 12:04:01
您可以考虑这样一个事实:如果程序只需要复制数据,它就不需要将数据保存在内存中。
现在Go标准库的强大特性是接口的合理使用:http.Response的Body成员实现了io.ReadCloser接口,满足了http.Client的Post方法的body参数的类型。
所以你可以这样滚:
http.Response的一个实例,该实例具有io.readCloser类型的Body成员。
请注意,此时您还没有开始从“源”服务器接收主体,因为要做到这一点,您必须耗尽io.ReadCloser of Body。POST)请求来发送数据,并在发出请求时提供Body成员在第一步中获得的数据。
完成此请求后,调用Body成员上的Body。就像这样:
import "net/http"
func Pipe(from, to string) (err error) {
src, err := http.Get(from)
if err != nil {
return
}
dst, err := http.Post(to, myPostType, src.Body)
if err != nil {
return
}
// Now read and then Close() the dst.Body member.
}在这段代码中,http.Post it itself。
您可以将bytes.Buffer添加到混合中,希望减少执行的syscalls数量,但除非普通方法不起作用,否则不要这样做。
发布于 2014-04-01 12:09:04
正如@Evan已经指出的:您可以在创建新缓冲区时选择初始缓冲区大小。
由于缓冲区的分配非常昂贵(这就是为什么您的grow调用需要这么长时间;如果缓冲区的大小不再合适,它们就重新分配),所以选择正确的缓冲区大小是关键。选择正确的缓冲区分配策略取决于许多因素。您可以根据应用程序配置文件选择自己的增长缓冲区的方法。
您还应该考虑回收缓冲区以防止堆碎片:http://blog.cloudflare.com/recycling-memory-buffers-in-go
https://stackoverflow.com/questions/22771854
复制相似问题