我是否可以只读取文件的n个字节而不创建n大小的缓冲区?

时间:2017-07-20 18:11:44

标签: go

我正在检测非常大(30+ GB)的文件是否相同。而不是散列所有30 GB,我认为我将哈希第一兆字节,然后兆字节从10%开始进入文件,然后兆字节从20%开始进入文件,依此类推。检测1000万字节是否相同对于我的目的来说已经足够了。

在Ruby或JavaScript中,当我这样做时,我只需创建一个10 MB的缓冲区,读入1 MB,在文件中向前搜索,在缓冲区中再读取1 MB,向前搜索等,然后哈希缓冲区。

在Go中,我对如何执行此操作感到有点困惑,因为ReadReadFullReadAtLeast等函数似乎都将缓冲区作为参数然后读到它们填满它。所以我可以分配11个单独的缓冲区,用单独的1 MB块填充10个,然后将它们连接到最后一个哈希...但这似乎超级低效和浪费。我确定我错过了一些东西,但是搜索文档只会让我更加困惑。什么是Go中这个问题的合适解决方案?我可以简单地要求将 n 字节读入预先存在的缓冲区吗?

1 个答案:

答案 0 :(得分:5)

您可以将传递的[]byte缓冲区切换为ReadReadFull

“切片”切片指向同一个支持数组,因此请分配完整缓冲区,并将其切片到位:

r.Read(buf[i : i+chunkSize])

io.ReadFull(r, buf[i:i+chunkSize])

https://play.golang.org/p/Uj626v-GE6