Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 大文件的原始数据线程安全缓冲区_C++_Multithreading_Bigdata - Fatal编程技术网

C++ 大文件的原始数据线程安全缓冲区

C++ 大文件的原始数据线程安全缓冲区,c++,multithreading,bigdata,C++,Multithreading,Bigdata,我有一个非常大的二进制文件(~200GB),其中包含序列化对象。迭代算法多次(100-200次)读取该文件,并独立处理所有记录 所有存储对象的处理顺序并不重要。这允许并行化算法。所以,这里的瓶颈是从文件读取 从文件中读取原始数据并使其被多个线程读取的最快方法是什么 注意:由于从磁盘读取要比处理对象慢得多,所以即使是反序列化也应该转移到worker。因此,我需要一个线程安全的原始数据存储。如果通过一个CPU进行处理消耗数据的速度快于存储的IO所能提供的速度,那么线程不会给您带来任何好处。实际上,操

我有一个非常大的二进制文件(~200GB),其中包含序列化对象。迭代算法多次(100-200次)读取该文件,并独立处理所有记录

所有存储对象的处理顺序并不重要。这允许并行化算法。所以,这里的瓶颈是从文件读取

从文件中读取原始数据并使其被多个线程读取的最快方法是什么


注意:由于从磁盘读取要比处理对象慢得多,所以即使是反序列化也应该转移到worker。因此,我需要一个线程安全的原始数据存储。

如果通过一个CPU进行处理消耗数据的速度快于存储的IO所能提供的速度,那么线程不会给您带来任何好处。实际上,操作系统非常擅长提前读取,并且使用DMA它可以同时进行读取,因此当您返回以获取更多内容时,它已经缓存了内容


也就是说,您可以只映射文件的内存,假设它适合您的进程空间,然后在文件的某些部分启动工作线程。或者,对于32位地址,为每个工作进程在内存映射文件上使用一个滑动窗口。这将合理地确保IO饱和,但它也会干扰操作系统的readahead,因此它甚至不会为您带来任何好处。

解决方案可能取决于所使用的操作系统。您对特定操作系统的解决方案感兴趣吗?或者该解决方案应该独立于操作系统吗?所有对象(即记录)是否每次都会更改?@nosid如果该解决方案是Unix特定的,则完全可以。@rakib否,文件的读取方式为obly