【问题标题】:Transfer a big file in golang在golang中传输一个大文件
【发布时间】:2014-04-25 04:19:17
【问题描述】:

客户端发送文件,大小可能大于5G,发送到从服务器,然后从发送到主服务器。

slave 会将临时文件保存到自己吗?我不希望它发生,因为它会减慢上传速度并浪费从站的内存。

有什么办法可以避免这种情况?在 golang 中传输大文件的最佳方法是什么?

【问题讨论】:

  • 如果你的slave作为一个relay工作,它是否可以只拥有一个有限的缓冲空间(从sender填充并由receiver连接消耗),如果它满了就拒绝接收?
  • 这是一个 http 服务器吗?
  • slave和master都是http服务器

标签: go


【解决方案1】:

是的,有一种避免存储转发方法的标准方法:一旦客户端连接从属服务器,后者应该打开与主服务器的连接,然后流式传输数据从那里的客户那里。通常这是使用io.Copy() 函数完成的。感谢 Go 使用接口的出色的鸭子类型,这适用于 TCP 连接和 HTTP 请求/响应。

(要获得更好的解释,您必须缩小问题范围。)

部分解决方案甚至出现在 stackoverflow 提出的类似问题中——here it is

【讨论】:

  • 我用了io.copy(),但是遇到error(内存不足)
  • @clinyong,但 you was given an explanation 已经(并且您已将其标记为已接受)。假设您没有遵循该建议。在某处(pastebin.com 等)发布一个最小的代码示例。
  • @clinyong,重申一下,io.Copy() 所做的只是从io.Reader 中读取数据以小块,然后将其铲到io.Writer 传递给它。因此,如果您收到 OOM 错误,您的数据很可能在写入器处累积,您的任务是找出原因。过度盲目的缓冲是一个非常合理的原因。
  • @clinyong,你能分享你的 io.Pipe 代码吗?我的 io.Pipe 代码挂起并且没有响应。我正在尝试将 3 GB 的文件上传到服务器。
猜你喜欢
  • 2013-10-16
  • 2016-07-15
  • 2020-02-25
  • 2012-12-08
  • 2017-05-30
  • 2010-10-08
  • 2018-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多