【发布时间】:2021-11-16 00:40:22
【问题描述】:
我需要散列非常大的文件(>10TB 文件)。所以我决定每 MB 散列 128KB。 我的想法是将文件分成 1MB 的块,并且只对每个块的前 128KB 进行哈希处理。
以下代码有效,但它使用了大量的内存,我不知道为什么......
func partialMD5Hash(filePath string) string {
var blockSize int64 = 1024 * 1024
var sampleSize int64 = 1024 * 128
file, err := os.Open(filePath)
if err != nil {
return "ERROR"
}
defer file.Close()
fileInfo, _ := file.Stat()
fileSize := fileInfo.Size()
hash := md5.New()
var i int64
for i = 0; i < fileSize / blockSize; i++ {
sample := make([]byte, sampleSize)
_, err = file.Read(sample)
if err != nil {
return "ERROR"
}
hash.Write(sample)
_, err := file.Seek(blockSize-sampleSize, 1)
if err != nil {
return "ERROR"
}
}
return hex.EncodeToString(hash.Sum(nil))
}
任何帮助将不胜感激!
【问题讨论】:
-
您在堆上分配了那么多数据。使 GC 混乱。减慢你的进程。吃掉你的记忆。
-
@mh-cbon 我该如何避免呢?
-
查看 Burak Serdar 的回答。
-
@mh-cbon 如果您阅读 cmets,您会知道他的帖子不是答案。尽管我将样本从循环中取出,但它仍然表现出相同的行为。
-
考虑一下,也许这不是问题的根源。
标签: go memory hash memory-leaks