2016-06-06 3 views
0

나는 골란에 초보자입니다. Amazon S3에서 여러 파일을 읽으 려합니다. s3gof3r 라이브러리를 사용하고 있습니다.golang을 사용하여 S3에서 여러 파일 읽기

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 개) 파일에서 읽기 루틴을 이동)가있는 경우 확실히 작동하지만 내가 더 많은 파일을 읽을 수있는 경우는 (I 충돌 다음과 같이

이동 루틴입니다 내가 얻을

) 오류를 10,000 개 이상의 파일을 읽을해야하는 것은 오류가 'ReadFrom'를 사용에서 오는

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) 

입니다. 이런 방식으로 ReadFrom을 사용하는 데 문제가 있습니까? 또는 이렇게 많은 파일을 읽는 작업을 수행하는 잘못된 방법입니까?

+2

먼저 오류를 확인하십시오. – JimB

+1

https://github.com/golang/go/wiki/CommonMistakes#using-goroutines-on-loop-iterator-variables – jbe

+1

JimB는 언급 한 바와 같이'r, _, err : = ...'을 수행하지만 do 오류를 확인하지 말라. 뭔가 잘못되었다는 것과 반환 된'r'이'nil'이 될 가능성이 완전히 있으며, 이는 충돌을 설명 할 것이다. 먼저'r'에 액세스하려고 시도하기 전에'err'이'nil'인지 확인한 다음이 케이스를 처리해야합니다. – val

답변

0

아마도 메모리가 부족합니다.

예를 들어 buf := new(bytes.Reader)이 오타입니까? bytes.Buffer을 의미합니까? 나는 그렇게 생각한다.

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

오류를 확인하십시오. 아마 그것은 ReadFrom 호출에서 bytes.ErrTooLarge가 될 것입니다.

ErrTooLarge is passed to panic if memory cannot be allocated to store data in a buffer.

+0

아니요, 메모리가 부족하면 "메모리 부족"오류가 발생합니다. 이것은 nil pointer dereference입니다. – JimB

+0

그래, 네가 메모리를 다 써 버렸을 때 정확히 무슨 일이 일어나고 내부 'bytes.Buffer'의 버퍼가 nil 포인터로 설정되어있다. 그리고 오류를 확인하지 않았으므로 포인터를 참조 해제하는 중입니다. – Darigaaz

+0

좋은 점은'bytes' 패키지가 할 수있을 때'ErrTooLarge'를 반환하려한다는 것을 잊었습니다. 나는 여전히 가정을하기 전에 오류를 점검 할 것이다. – JimB