Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.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+中并行读取大型文本文件+;_C++ - Fatal编程技术网

C++ 在C+中并行读取大型文本文件+;

C++ 在C+中并行读取大型文本文件+;,c++,C++,我有一个很大的文本文件。。我想读取此文件并在其中执行一些操作 此操作在每一行上独立进行。所以基本上,我在寻找一些函数,可以实现这个并行 void readFile(string filename){ //do manipulation } 那就是操纵可以同时发生 void readFile(string filename){ //do manipulation } 同意使用hadoop可以很容易地做到这一点,但这是一个过分的解决方案。(它的文件很大,但没有我需要hadoop的

我有一个很大的文本文件。。我想读取此文件并在其中执行一些操作

此操作在每一行上独立进行。所以基本上,我在寻找一些函数,可以实现这个并行

void readFile(string filename){

  //do manipulation

}
那就是操纵可以同时发生

void readFile(string filename){

  //do manipulation

}
同意使用hadoop可以很容易地做到这一点,但这是一个过分的解决方案。(它的文件很大,但没有我需要hadoop的那么大…)


我在C++中如何做到这一点?

我建议你使用一些类似于 Frad 的方法来读取多行到缓冲区中,然后并行运行在缓冲区上。
void readFile(string filename){

  //do manipulation

}

我曾经一次读取一个图像一个像素(int),对像素进行转换,然后将值写入缓冲区。对于一个大文件来说,这花费了超过1分钟的时间。当我改为使用
fread
先将整个文件读入缓冲区,然后在内存中的缓冲区上进行转换时,整个操作只花了不到一秒钟的时间。在不使用任何并行性的情况下,这是一个巨大的改进

由于您的文件太大,您可以在卡盘中读取它,因此并行操作块,然后在下一个卡盘中读取。您甚至可以在并行处理前一个卡盘(例如7个线程)时读取下一个卡盘(带有一个线程),但您可能会发现这甚至不是必需的。就个人而言,我会使用OpenMP进行并行处理

编辑:我忘了提到我给出了使用
fread
读取文件并与OpenMP并行处理行的答案
修改代码来做您想做的事情可能很简单。

我会使用它。mmap为您提供了类似内存的文件访问权限,所以您可以轻松地并行读取。请看。在mmap中使用非只读模式时要小心。

如果我要面对这个问题并且必须解决它,我只会使用单线程方法,在不加快底层介质的情况下投入太多精力是不值得的

假设您在ramdisk、真正快速的raid或其他东西上有这个,或者处理过程有很大的不平衡。不管是哪种情况,行处理现在占用了大部分时间

我的解决方案结构如下:

class ThreadPool; // encapsulates a set of threads
class WorkUnitPool; // encapsulates a set of threadsafe work unit queues
class ReadableFile; // an interface to a file that can be read from

ThreadPool pool;
WorkUnitPool workunits;
ReadableFile file;

pool.Attach(workunits); // bind threads to (initially empty) work unit pool

file.Open("input.file")
while (!file.IsAtEOF()) workunits.Add(ReadLineFrom(file));

pool.Wait(); // wait for all of the threads to finish processing work units
我的“解决方案”是一个通用的、高层次的设计,旨在激发人们对现有工具的思考,使他们能够适应您的需求。为了使用这个,你必须仔细考虑,这正是我想要的


与任何线程操作一样,要非常小心地正确设计它,否则您将遇到竞争条件、数据损坏和各种痛苦。如果您可以找到一个线程池/工作单元库来为您执行此操作,请务必使用它。

读入一个线程,将这些行传递给其他线程。为每个线程创建一系列要读取的行,如果可能,将其均匀分布。其余的只是使用语言功能来完成这一点,对此,您应该做一些研究。您需要线程的工作队列:在这方面投入太多的工作可能没有意义,因为归根结底,您会发现自己受到磁盘访问速度的限制。如果您试图从多个线程读取数据,那么最终将由于抖动而失去性能。您可以使用生产者-消费者方法,但由于线程的开销,您可能无法体验到所需的加速。99.9%的时间用于从磁盘获取数据,而您无法使读取本身并行。虽然您可以并行读取,但顺序读取可能要快得多,因为它对缓存更友好。不管怎样,如果没有一个合适的基准,你永远无法确定。当然,这取决于你。正如您所说,需要对适当的数据流进行基准测试。在某些情况下,mmap是一个非常简洁的选项。知道这件事真是太好了。