如何使用线程将内容从一个文件复制到多个文件

时间:2012-04-19 14:21:06

标签: c++ boost

我有一个大文件。这是一个文本文件,所以我一次只读一行。

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环境。

1 个答案:

答案 0 :(得分:1)

除非每个新文件位于单独的物理设备上,否则仅使用多个线程写入单个文件不太可能获得性能提升。这种类型的进程通常是I / O绑定而不是CPU绑定。

确保使用缓冲I / O的一个重要事项(自显示ifstream以来就是这种情况)。如果没有缓冲的I / O,将各行写入不同文件的延迟将是一个巨大的瓶颈。

编辑鉴于可以将各行写入单独的设备,可能通过使用多个线程获得性能。如果存在长延迟(例如,如果通过某种机制发送到另一台机器,则在网络上发送呼叫),那么其他线程仍然可以写入其他位置,因此这肯定会有所帮助。

我可能不完全理解这个问题,但似乎使用thread pool是有意义的。一种可能性是使用threadpool。我没有用它,但似乎有一个良好的声誉。