首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Go中有效地使用大型数据数组(超过10 with )?

如何在Go中有效地使用大型数据数组(超过10 with )?
EN

Stack Overflow用户
提问于 2014-03-31 20:47:16
回答 3查看 1.4K关注 0票数 2

我正在使用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回答来了解我的问题所在。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-31 21:32:16

看看bytes.NewBufferhttp://golang.org/pkg/bytes/#NewBuffer的描述

听起来,您可以创建一个16 to字节的切片,并使用它初始化缓冲区。

票数 5
EN

Stack Overflow用户

发布于 2014-04-01 12:04:01

您可以考虑这样一个事实:如果程序只需要复制数据,它就不需要将数据保存在内存中。

现在Go标准库的强大特性是接口的合理使用:http.ResponseBody成员实现了io.ReadCloser接口,满足了http.ClientPost方法的body参数的类型。

所以你可以这样滚:

  1. 对文档执行请求--您将得到http.Response的一个实例,该实例具有io.readCloser类型的Body成员。 请注意,此时您还没有开始从“源”服务器接收主体,因为要做到这一点,您必须耗尽io.ReadCloser of Body
  2. 启动另一个(据说是POST)请求来发送数据,并在发出请求时提供Body成员在第一步中获得的数据。 完成此请求后,调用Body成员上的Body

就像这样:

代码语言:javascript
运行
复制
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数量,但除非普通方法不起作用,否则不要这样做。

票数 2
EN

Stack Overflow用户

发布于 2014-04-01 12:09:04

正如@Evan已经指出的:您可以在创建新缓冲区时选择初始缓冲区大小。

由于缓冲区的分配非常昂贵(这就是为什么您的grow调用需要这么长时间;如果缓冲区的大小不再合适,它们就重新分配),所以选择正确的缓冲区大小是关键。选择正确的缓冲区分配策略取决于许多因素。您可以根据应用程序配置文件选择自己的增长缓冲区的方法。

您还应该考虑回收缓冲区以防止堆碎片:http://blog.cloudflare.com/recycling-memory-buffers-in-go

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22771854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档