我有一个大文件。这是一个文本文件,所以我一次只读一行。
std::ifstream inFile( "big_file.txt" );
std::string line;
while( getline( inFile, line ) )
{
}
我想将从'big_file.txt'读取的行分发给多个文件。文件计数取决于机器上可用的核心数量。
编辑: 目标文件可能位于不同的物理设备上,或者内容可能发送到其他机器上
到目前为止我的(不成功)尝试如下
// list of writer objects each running in its own thread
std::vector<FileWriter> writers;
// create as many threads as there are cores
unsigned long const cores = boost::thread::hardware_concurrency();
for( unsigned long i = 0; i < cores; ++i)
{
std::ostringstream ss;
ss << i;
FileWriter rt(ss.str());
writers.push_back(rt);
}
然后当我调用getline(inFile, line),
时,我希望能够以循环方式将线路发送到线程。它真的不一定是循环的;无论什么方法最好在线程之间分配工作都很好
我已经没有想法了。
请提示boost和pre c ++ 11 STL,因为我还没有完整的c ++ 11环境。
答案 0 :(得分:1)
除非每个新文件位于单独的物理设备上,否则仅使用多个线程写入单个文件不太可能获得性能提升。这种类型的进程通常是I / O绑定而不是CPU绑定。
确保使用缓冲I / O的一个重要事项(自显示ifstream
以来就是这种情况)。如果没有缓冲的I / O,将各行写入不同文件的延迟将是一个巨大的瓶颈。
编辑鉴于可以将各行写入单独的设备,可能通过使用多个线程获得性能。如果存在长延迟(例如,如果通过某种机制发送到另一台机器,则在网络上发送呼叫),那么其他线程仍然可以写入其他位置,因此这肯定会有所帮助。
我可能不完全理解这个问题,但似乎使用thread pool是有意义的。一种可能性是使用threadpool。我没有用它,但似乎有一个良好的声誉。