我有一个很大的文本文件。我想读取这个文件并对其进行一些操作。
这些操作独立于每一行。因此,我正在寻找一些可以并行执行此操作的函数。
void readFile(string filename){
//do manipulation
}
操作可以并行进行。
虽然可以使用 Hadoop 轻松实现此操作,但这是一个过度解决方案。(这是一个大文件,但不需要 Hadoop 处理...)
我该如何在 C++ 中实现这个操作?
我有一个很大的文本文件。我想读取这个文件并对其进行一些操作。
这些操作独立于每一行。因此,我正在寻找一些可以并行执行此操作的函数。
void readFile(string filename){
//do manipulation
}
操作可以并行进行。
虽然可以使用 Hadoop 轻松实现此操作,但这是一个过度解决方案。(这是一个大文件,但不需要 Hadoop 处理...)
我该如何在 C++ 中实现这个操作?
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
我的“解决方案”是一个通用的、高级别的设计,旨在引发您思考什么工具可用于您可以根据自己的需求进行调整。您将不得不仔细考虑如何使用它,这也是我想要的。
与任何线程操作一样,非常谨慎地设计它,否则您将遇到竞争条件、数据损坏以及各种痛苦。如果您能找到一个为您完成此操作的线程池/工作单元库,请务必使用它。
fread
的方法将多行读入缓冲区,然后并行处理缓冲区。您可以在此处查看相关内容:http://www.cplusplus.com/reference/cstdio/fread/
我曾经逐个像素(int)读取图像,进行像素转换,然后将值写入缓冲区。对于大文件,这需要超过1分钟的时间。但如果我先使用fread
将整个文件读入缓冲区,然后在内存中对缓冲区进行转换,整个操作只需要不到一秒钟的时间。这是一个巨大的改进,而且没有使用任何并行处理。fread
读取文件,并使用OpenMP并行处理行。您可以在此处查看相关代码:openmp - while loop for text file reading and using a pipeline。对于您的需求,修改该代码可能非常简单。