1

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

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

4

1 回答 1

1

除非每个新文件都在单独的物理设备上,否则仅通过使用多个线程来写入单个文件不太可能提高性能。这种类型的进程通常会受 I/O 限制而不是 CPU 限制。

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

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

我可能不完全理解这个问题,但似乎使用线程池才有意义。一种可能性是使用threadpool。我没用过,不过好像口碑不错。

于 2012-04-19T14:23:50.333 回答