我有一个大文件。这是一个文本文件,所以我一次读一行。
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 环境。
最佳答案
除非每个新文件都位于单独的物理设备上,否则仅通过使用多个线程写入单个文件不太可能获得性能 boost 。这种类型的进程通常是 I/O 绑定(bind)而不是 CPU 绑定(bind)。
要确保的一件重要事情是使用缓冲 I/O(自从您显示 ifstream
以来似乎就是这种情况)。如果没有缓冲 I/O,将单行写入不同文件的延迟将是一个巨大的瓶颈。
编辑 考虑到单独的行可能被写入不同的设备,那么它可能通过使用多个线程来 boost 性能。如果有很长的延迟(例如,如果通过某种机制发送到另一台机器,则在网络发送调用上),那么其他线程可能仍在写入其他位置,所以这肯定会有所帮助。
我可能不完全理解这个问题,但似乎使用 thread pool 才有意义.一种可能性是使用 threadpool .我没用过,但是好像口碑不错。
关于c++ - 如何使用线程将内容从一个文件复制到多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10230162/