最近我开始为 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")
}
更糟糕的是,当我想使用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 和示例。拥有可用的代码很好,但理解为什么它的工作远高于此。
缥缈止盈
Cats萌萌
相关分类