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

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

最佳答案

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

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

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

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

关于c++ - 如何使用线程将内容从一个文件复制到多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10230162/

相关文章:

c++ - SDL_RenderSetClipRect 在不同平台上的工作方式不同 - 如何检测是从顶部还是底部测量?

c++ - C++使用 vector 实现Mergesort

c++ - 我可以使用 wxWidgets 而不是 Qt 吗?

c++更新 boost 版本问题

macos - osx conda install boost 用 gcc 编译

c++ - Boost 1.36 与 STLPort 4.6.2 编译错误

c++ - 如何使用boost使用shared_ptr成员序列化对象

c++ - 删除和存储数组中的重复项

c++ - 在 C/C++ 中多次包含头文件

c++ - boost shared_ptr的底层设计