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

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

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

    由于I/O的限制,我认为尝试并发读取文件没有任何意义。但是,我看不出为什么无法使用goroutines解析1024字节的记录,从而无法同时解析多个1024字节的记录。我是Go的新手,所以我想看看这是否有意义,或者是否有更好(更快)的方法:
  • 一个主函数打开文件,一次读取1024个字节到字节数组(记录)中。
  • 记录将传递给将数据解析为映射或结构的函数。解析器函数将在每个记录上被称为goroutine。
  • 解析的 map /结构通过 channel 附加到 slice 。我会将由分片管理的基础数组预先分配为文件大小(以字节为单位)除以1024,因为这应该是元素的确切数量(假设没有错误)。

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

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

    Cross-posted on Software Engineering

    最佳答案

    这是producer-consumer problem的一个实例,其中生产者是生成1024字节记录的主要功能,而使用者应处理这些记录并将其发送到 channel ,以便将它们添加到最终 slice 中。有一些questions tagged producer-consumer and Go,它们应该帮助您入门。至于最快的情况,则取决于很多事情,因此实际上无法回答。最好的解决方案可能是从完全顺序实现到服务器集群的任何位置,在该服务器集群中,RabbitMQ或类似的东西在其中移动记录。

    10-02 08:04
    查看更多