我有一个非常大的二进制文件(~200GB),其中包含序列化对象。迭代算法多次读取此文件(100-200次)并独立处理所有记录。
处理所有存储对象的顺序并不重要。这允许并行化算法。所以,这里的瓶颈是从文件中读取。
从文件中读取原始数据并使其可被多个线程读取的最快方法是什么?
注意:由于从磁盘读取比处理对象慢得多,因此即使反序列化也应该移动到工作者。所以我需要一个线程安全的原始数据存储。
答案 0 :(得分:0)
如果通过一个CPU处理数据的速度比存储器提供的数据快,则线程不会给您带来任何好处。实际上,操作系统非常擅长提前读取,并且使用DMA同时执行此操作,因此当您返回以检索更多内容时,它已经有缓存的内容。
也就是说,您可以对文件进行内存映射,假设它适合您的进程空间,然后在文件的某些部分启动工作线程。或者,对于32位地址,在每个worker的内存映射文件上使用一个滑动窗口。这将合理地确保IO已经饱和,但它也会混淆操作系统的预读,所以它可能甚至不会为你带来任何好处。