最近我正在为 go 中的文件创建校验和。我的代码正在处理大小文件。我尝试了两种方法,第一种使用ioutil.ReadFile("filename")
,第二种使用os.Open("filename")
.
例子:
第一个功能是处理io/ioutil
小文件。当我尝试复制一个大文件时,我的 ram 被爆破,对于 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")
}
更糟糕的是,当我想用 and 创建校验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 文件不应该填满我的 16GB 内存。我现在不知道在哪里看。有人可以解释这些方法之间的区别吗?阅读 go-doc 和示例时,我不明白。拥有可用的代码很好,但要理解为什么它的工作方式远高于此。
提前致谢!