【问题标题】:Concurrently parsing records in a binary file in Go在 Go 中同时解析二进制文件中的记录
【发布时间】:2017-09-01 20:23:30
【问题描述】:

我有一个要解析的二进制文件。该文件被分解为每个 1024 字节的记录。所需的高级步骤是:

  1. 从文件中一次读取 1024 个字节。
  2. 解析每个 1024 字节的“记录”(块)并将解析后的数据放入映射或结构中。
  3. 将解析后的数据和任何错误返回给用户。

我不是在寻找代码,我只是在寻找设计/方法方面的帮助。

由于 I/O 限制,我认为尝试从文件中进行并发 读取 是没有意义的。但是,我看不出为什么不能使用 goroutine 解析 1024 字节的记录,以便同时解析多个 1024 字节的记录。我是 Go 新手,所以我想看看这是否有意义,或者是否有更好(更快)的方法:

  1. 一个主函数打开文件并一次将 1024 个字节读入字节数组(记录)中。
  2. 记录被传递给将数据解析为映射或结构的函数。解析器函数将在每条记录上作为 goroutine 调用。
  3. 解析的映射/结构通过通道附加到切片。我会将切片管理的底层数组预先分配为文件大小(以字节为单位)除以 1024,因为这应该是元素的确切数量(假设没有错误)。

我必须确保我的内存也不会耗尽,因为文件的大小可以从几百 MB 到 256 TB(很少见,但可能)。这有意义还是我错误地考虑了这个问题?当我一次读取 1024 个字节时,这会比简单地以线性方式解析文件要慢,还是会同时解析这些记录作为字节数组执行得更好?还是我想的问题全错了?

我不是在寻找代码,我只是在寻找设计/方法方面的帮助。

Cross-posted on Software Engineering

【问题讨论】:

  • 如果您想知道哪种方法更快,您需要对它们进行基准测试。使其并发的开销可能会抵消任何节省,但如果没有测试的实现,我们只是在猜测。

标签: parsing design-patterns go concurrency


【解决方案1】:

这是producer-consumer problem 的一个实例,其中生产者是生成 1024 字节记录的主要函数,消费者应处理这些记录并将它们发送到通道,以便将它们添加到最终切片中。有几个questions tagged producer-consumer and Go,它们应该可以帮助您入门。至于在您的情况下最快的是什么,这取决于很多事情,实际上无法回答。最好的解决方案可能是从完全顺序的实现到由 RabbitMQ 或类似的东西移动记录的服务器集群。

【讨论】:

  • 谢谢!这很有帮助。
猜你喜欢
  • 2021-12-21
  • 2021-05-19
  • 2018-03-07
  • 1970-01-01
  • 2020-05-21
  • 2023-03-11
  • 2010-10-19
  • 1970-01-01
  • 2015-06-21
相关资源
最近更新 更多