我是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是否有问题?或者这是完成阅读这么多文件的错误方法吗?
答案 0 :(得分:0)
可能你的内存不足了。
在您的示例中,这是一个错字buf := new(bytes.Reader)
,您的意思是bytes.Buffer
吗?我想是的。
r, _, err := b.GetReader(...)
//...
n, err := buf.ReadFrom(r)
检查那里的错误。可能是ReadFrom调用中的bytes.ErrTooLarge。
如果无法分配内存以将数据存储在缓冲区中,则会将ErrTooLarge传递给恐慌。