【发布时间】:2017-09-01 20:23:30
【问题描述】:
我有一个要解析的二进制文件。该文件被分解为每个 1024 字节的记录。所需的高级步骤是:
- 从文件中一次读取 1024 个字节。
- 解析每个 1024 字节的“记录”(块)并将解析后的数据放入映射或结构中。
- 将解析后的数据和任何错误返回给用户。
我不是在寻找代码,我只是在寻找设计/方法方面的帮助。
由于 I/O 限制,我认为尝试从文件中进行并发 读取 是没有意义的。但是,我看不出为什么不能使用 goroutine 解析 1024 字节的记录,以便同时解析多个 1024 字节的记录。我是 Go 新手,所以我想看看这是否有意义,或者是否有更好(更快)的方法:
- 一个主函数打开文件并一次将 1024 个字节读入字节数组(记录)中。
- 记录被传递给将数据解析为映射或结构的函数。解析器函数将在每条记录上作为 goroutine 调用。
- 解析的映射/结构通过通道附加到切片。我会将切片管理的底层数组预先分配为文件大小(以字节为单位)除以 1024,因为这应该是元素的确切数量(假设没有错误)。
我必须确保我的内存也不会耗尽,因为文件的大小可以从几百 MB 到 256 TB(很少见,但可能)。这有意义还是我错误地考虑了这个问题?当我一次读取 1024 个字节时,这会比简单地以线性方式解析文件要慢,还是会同时解析这些记录作为字节数组执行得更好?还是我想的问题全错了?
我不是在寻找代码,我只是在寻找设计/方法方面的帮助。
【问题讨论】:
-
如果您想知道哪种方法更快,您需要对它们进行基准测试。使其并发的开销可能会抵消任何节省,但如果没有测试的实现,我们只是在猜测。
标签: parsing design-patterns go concurrency