2017-04-06 55 views
0

一个二进制文件,同时解析记录,我有我想分析的二进制文件。该文件被分解成每个都是1024字节的记录。所需的高级步骤是:在围棋

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

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

由于I/O限制,我认为从文件中尝试并发读取是没有意义的。但是,我没有看到为什么无法使用goroutine分析1024字节的记录,以便同时解析多个1024字节的记录。我是新来走,所以我想看看这是有道理的,或者有更好的(更快)的方式:

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

我不得不确保我没有用完内存,因为文件可以从几百MB到256TB(罕见但可能)。这是否合理?还是我错误地考虑了这个问题?这是否比仅仅以一种线性方式解析文件要慢?因为我一次读取1024个字节,或者当字节数组执行得更好时,会同时解析这些记录?还是我在想这个问题都是错的?

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

Cross-posted on Software Engineering

+0

如果你想知道哪种方法比较快,就需要比较基准。使其并发的开销可能会否定任何节省,但如果没有执行测试,我们只是在猜测。 – JimB

回答

2

这是producer-consumer problem,其中生成器是产生1024字节记录你的主要功能和消费者应该处理这些记录,并将它们发送到一个通道,使他们加入的一个实例到最后一片。有几个questions tagged producer-consumer and Go,他们应该让你开始。至于什么是你的情况最快,它取决于很多事情,它是不可能回答的。最好的解决方案可能是从完全顺序的实现到RabbitMQ或类似的记录被移动的服务器集群中的任何地方。

+0

谢谢!这非常有帮助。 – Dan