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

标签 go

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

在 Ruby 或 JavaScript 中,当我执行此操作时,我只需创建一个 10 MB 缓冲区,将 1 MB 读入其中,在文件中向前查找,将另外 1 MB 读入缓冲区,向前查找等,然后对缓冲区进行哈希处理。

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

最佳答案

您可以对传递给 ReadReadFull[]byte 缓冲区进行 slice 。

“slice ” slice 指向相同的后备数组,因此分配完整的缓冲区,并将其就地 slice :

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

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

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

关于go - 我可以只读取文件的 n 个字节而不创建 n 大小的缓冲区吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45222251/

相关文章:

go - 如何以特殊格式解析golang中的日期时间?

go - Go : unable to authenticate, 中的 SSH 尝试了方法 [无],没有支持的方法

go - 为什么goroutine会暂停几分钟

go - 如何设置CORS设置

arrays - channel 元素类型太大 Golang

arrays - SQL 选择查询的循环结果

go - Golang-为什么总是ItoA在返回字符串时删除初始0

oop - 反射(reflect)嵌入结构的类型

postgresql - 将自定义类型数组插入 postgres

go - 在 Go 中交换变量值的最佳方式?