从磁盘读取10 GB文件的最快方法是什么?

ale*_*lex 11 io perl performance mmap

我们需要读取和计算不同类型的消息/在10 GB文本文件上运行一些统计信息,例如FIX引擎日志.我们使用Linux,32位,4位CPU,英特尔,在Perl中编码,但语言并不重要.

我在Tim Bray的WideFinder项目中找到了一些有趣的提示 .但是,我们发现使用内存映射本质上受到32位架构的限制.

我们尝试使用多个进程,如果我们使用4个CPU上的4个进程并行处理文件,这似乎更快.添加多线程会降低速度,这可能是因为上下文切换的成本.我们尝试更改线程池的大小,但这仍然比简单的多进程版本慢.

内存映射部分不是很稳定,有时在2 GB文件上需要80秒,有时需要7秒,可能来自页面错误或与虚拟内存使用相关的内容.无论如何,Mmap在32位架构上无法扩展到4 GB以上.

我们尝试了Perl的IPC :: MmapSys :: Mmap.看看Map-Reduce也是如此,但问题实际上是I/O绑定,处理本身就足够快了.

所以我们决定尝试通过调整缓冲大小,类型等来优化基本I/O.

任何知道现有项目的人都可以在任何语言/平台上有效地解决这个问题,指向有用的链接或建议方向吗?

Hyn*_*dil 9

大多数情况下,您将受I/O绑定而不受CPU限制,因此只需通过普通的Perl I/O读取此文件并在单线程中处理它.除非您证明您可以执行比单CPU工作更多的I/O,否则不要浪费您的时间.无论如何,你应该问:为什么地球上这是一个巨大的文件?为什么地球上的它们在产生它时会以合理的方式分裂它?这将是更值得的工作.然后你可以将它放在单独的I/O通道中并使用更多的CPU(如果你不使用某种RAID 0或NAS或......).

措施,不要假设.不要忘记在每次测试之前刷新缓存.请记住,序列化I/O比随机速度快.