最近我正在爲go中的文件創建校驗和。我的代碼正在處理小文件和大文件。我嘗試了兩種方法,第一種使用ioutil.ReadFile("filename")
,第二種使用os.Open("filename")
。文件讀取和校驗和進去。方法之間的區別
例子:
第一個功能正在與io/ioutil
和適用於小文件。當我嘗試複製一個大文件時,我的RAM獲得了blastt,對於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和示例並不能理解它。 有可用的代碼是很好的,但理解爲什麼它的工作就是這樣。
在此先感謝!