При чтении файла кусками, используя reader.Read
, он считывает 32 КБ для каждого вызова.
Но если я использую reader.ReadBytes
, он уменьшает количество прочитанных байтов следующим reader.Read
до 3KB.При чтении файла, почему ReadBytes влияет на следующее чтение?
Другой вопрос: почему не я могу читать больше, чем 32KB использованием reader.Read
и bufio.NewReaderSize
?
Мой код:
func SomeFunc() {
gzfile , err := os.Open(SomeFile)
ErrorPanic (err)
input_file , err := gzip.NewReader(gzfile)
ErrorPanic (err)
// reader := bufio.NewReaderSize(input_file, 120 * 1024 * 1024) //120MB
reader := bufio.NewReader(input_file)
.....
eof := false
for !eof {
var n int
// line := make ([]byte,100 * 1024 * 1024) //100MB
line := make ([]byte,32 * 1024) //32KB
n , err = reader.Read (line)
eof = is_eof (err)
_ , err = buffer.Write (line)
/***/ fmt.Println("len (line)= " , len (line) , " ; n= ",n)
line = []byte{}
ErrorNotice (err)
eos := false
for !eof && !eos {
line , err = reader.ReadBytes('\n')
eof = is_eof (err)
if SomeCond {
.....
buffer.Reset()
eos = true
}
_ , err = buffer.Write (line)
ErrorNotice (err)
}
}
}
func ErrorPanic(err error) .....
func ErrorNotice (err error) .....
func is_eof (err error) bool .....
Выход при вызове ReadBytes('\n')
:
len (line)= 32768 ; n= 32768
len (line)= 32768 ; n= 3782
len (line)= 32768 ; n= 2966
len (line)= 32768 ; n= 2835
len (line)= 32768 ; n= 2756
len (line)= 32768 ; n= 3513
len (line)= 32768 ; n= 2583
len (line)= 32768 ; n= 3247
Выход при не вызова ReadBytes('\n')
:
len (line)= 32768 ; n= 32768
len (line)= 32768 ; n= 32768
len (line)= 32768 ; n= 32768
Метод 'Read'' 'iio.Reader' позволяет возвращать как можно меньше байтов:' Read (p [] byte) (n int, ошибка err) 'может возвращать любое' n' такое, что '0 <= n <= len (p)'; разрешено использовать [фазу луны] (https://www.freebsd.org/cgi/man.cgi?query=pom&sektion=6), чтобы решить, сколько байтов будет возвращено на любой данный вызов, если захочет. Вам нужно проверить, сколько байтов возвращается (например, 'line = line [: n]' перед его использованием), или если вам требуется определенная сумма, используйте что-то вроде ['io.ReadFull'] (https://golang.org/упак/ю/# ReadFull). –