使用golang从S3读取多个文件

时间:2016-06-06 13:35:31

标签: go amazon-s3

我是golang的新手。 我想从Amazon S3读取多个文件。我正在使用s3gof3r库。

go例程如下:

for i := 1; i <= fileNo; i++ {
    go test(i, b)
}

func test(i int, b *Bucket) () {
    fmt.Println("Loading file no:" + strconv.Itoa(i))
    defer wg.Done()
    r, _, err := b.GetReader("testFile_" + strconv.Itoa(i) + ".htm", nil)
    buf := new(bytes.Buffer)
    buf.ReadFrom(r)
    fmt.Println(err)
    fmt.Println("Completed file no:" + strconv.Itoa(i))
    r.Close()           
    }

如果我有大约200个文件(即从200个文件中读取200个例程),此代码可以正常工作,但如果我必须阅读更多文件(我必须阅读超过10,000个文件)它会崩溃

我得到的错误是

 panic: runtime error: invalid memory address or nil pointer dereference
    panic(0x39fde0, 0xc8200100f0)
    /usr/local/go/src/runtime/panic.go:464 +0x3e6
bytes.(*Buffer).ReadFrom(0xc8200d3f18, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/bytes/buffer.go:176 +0x239
main.test(0x4c, 0xc8200bc8e0)

错误来自于使用&#39; ReadFrom&#39;。以这种方式使用ReadFrom是否有问题?或者这是完成阅读这么多文件的错误方法吗?

1 个答案:

答案 0 :(得分:0)

可能你的内存不足了。

在您的示例中,这是一个错字buf := new(bytes.Reader),您的意思是bytes.Buffer吗?我想是的。

r, _, err := b.GetReader(...)
//...
n, err := buf.ReadFrom(r)

检查那里的错误。可能是ReadFrom调用中的bytes.ErrTooLarge。

  

如果无法分配内存以将数据存储在缓冲区中,则会将ErrTooLarge传递给恐慌。