Недавно я создаю контрольные суммы для файлов в go. Мой код работает с небольшими и большими файлами. Я попробовал два метода, первый использует ioutil.ReadFile("filename")
, а второй работает с os.Open("filename")
.Чтение файлов и контрольные суммы в go. Разница между методами
Примеры:
Первая функция работает с io/ioutil
и работает для небольших файлов. Когда я пытаюсь скопировать большой файл, мой баран получает blastet, а для 1.5GB iso он использует 3GB RAM.
func byteCopy(fileToCopy string) {
file, err := ioutil.ReadFile(fileToCopy) //1.5GB file
omg(err) //error handling function
ioutil.WriteFile("2.iso", file, 0777)
os.Remove("2.iso")
}
Еще хуже, когда я хочу, чтобы создать контрольную сумму с crypto/sha512
и io/ioutil
. Он никогда не закончится и не прервется, потому что у него заканчивается память.
func ioutilHash() {
file, _ := ioutil.ReadFile(iso)
h := sha512.New()
fmt.Printf("%x", h.Sum(file))
}
При использовании функции ниже все работает нормально.
func ioHash() {
f, err := os.Open(iso) //iso is a big ~ 1.5tb file
omg(err) //error handling function
defer f.Close()
h := sha512.New()
io.Copy(h, f)
fmt.Printf("%x", h.Sum(nil))
}
Мой вопрос:
Почему функция ioutil.ReadFile()
не работает правильно? 1.5GB-файл не должен заполнять 16 ГБ RAM. Я не знаю, где искать сейчас. Может ли кто-нибудь объяснить различия между методами? Я не понимаю это, читая go-doc и примеры. Имея полезный код хорошо, но понимая, почему его работа над ним выше.
Заранее благодарен!