gpt4 book ai didi

go - 在 Golang 中读取 Zlib 压缩文件的最有效方法?

转载 作者:IT王子 更新时间:2023-10-29 01:15:43 28 4
gpt4 key购买 nike

我正在读入并同时解析(解码)自定义格式的文件,该文件使用 zlib 压缩。我的问题是如何在不增加 slice 的情况下有效地解压缩然后解析未压缩的内容?我想在将其读入可重用缓冲区的同时对其进行解析。

这是一个对速度敏感的应用程序,所以我想尽可能高效地阅读它。通常我只是 ioutil.ReadAll 然后再次循环遍历数据来解析它。这次我想在读取时解析它,而不必增加读取它的缓冲区,以获得最大效率。

基本上我在想,如果我能找到一个完美大小的缓冲区,那么我就可以读入它,解析它,然后再次写入缓冲区,然后解析它,等等。这里的问题是 zlib每次调用 Read(b) 时,reader 似乎都读取了任意数量的字节;它不填充 slice 。因此,我不知道完美的缓冲区大小是多少。我担心它可能会将我写入的一些数据分成两 block ,从而难以解析,因为有人说 uint64 可以分成两次读取,因此不会出现在同一个缓冲区读取中 - 或者可能永远不会发生,它总是以与最初写入的大小相同的 block 的形式读出?

  1. 最佳缓冲区大小是多少,或者是否有计算方法?
  2. 如果我使用 f.Write(b []byte) 将数据写入 zlib writer,那么在回读压缩数据时是否可能将相同的数据分成两次读取(意思是我必须在解析过程中有一个历史记录),或者它总是会在同一次读取中返回吗?

最佳答案

您可以将 zlib 阅读器包装在 bufio 阅读器中,然后在其上实现一个专门的阅读器,该阅读器将通过从 bufio 阅读器读取直到读取完整 block 来重建您的数据 block 。请注意,bufio.Read 在底层 Reader 上最多调用一次 Read,因此您需要在循环中调用 ReadByte。但是,bufio 将为您处理 zlib 阅读器返回的不可预测的数据大小。

如果您不想实现专门的读取器,您可以使用 bufio 读取器并使用 ReadByte() 读取所需的字节数以填充给定的数据类型。最佳缓冲区大小至少是最大数据结构的大小,最多可以放入内存。

如果您直接从 zlib 读取器读取,则无法保证您的数据不会在两次读取之间拆分。

另一个可能更简洁的解决方案是为您的数据实现一个写入器,然后使用 io.Copy(your_writer, zlib_reader)。

关于go - 在 Golang 中读取 Zlib 压缩文件的最有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27504872/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com