【问题标题】:How to parallel processing line by line using c++如何使用c ++逐行并行处理
【发布时间】:2016-07-16 05:45:12
【问题描述】:

我想加快程序处理速度 这是代码:

int main(){
ifstream fin("./europarl_clean_1-5000.en");
        ifstream fin2("./europarl_clean_1-5000.fr");
        while(!(fin.eof()&&fin2.eof())){
        string english,chinese;
            getline(fin,english);
            getline(fin2,chinese);
            fun1();
            fun2();
            fun3();
        }
}

两个文件每个文件超过5000行,我想一次处理2行以上,这样可以加快程序运行时间,代码只是逐行处理,如何重写??

【问题讨论】:

标签: c++ parallel-processing


【解决方案1】:

至于您的问题,使用两个线程将文件读取到两个向量中,每个线程一个文件。然后你可以用任何你想要的方式处理向量。

如果输入文件中的数据行不相关,您可以使用例如每个向量有两个线程,每个线程处理一半的向量。如果输入的行是相关的并且您需要按顺序处理它们,那么您可以为向量使用一个线程。如果您需要处理来自每个向量的交替行,那么只需一个线程。


关于文件读取的注意事项:即使您使用线程进行读取,性能实际上可能会更慢。这完全取决于文件的存储位置。如果文件都位于单个机械硬盘驱动器上,则性能可能会变差,因为磁盘必须来回跳转才能读取文件。如果文件位于两个单独的磁盘或 SSD 上,则应通过每个线程读取文件来提高性能。


文件读取的可能实现

auto reader = [](std::vector<std::string>& v, std::istream& f)
{
    std::string s;
    v.reserve(5000);  // Allocate space for 5000 strings
    while (std::getline(f, s))
        v.push_back(s);
};

std::vector<std::string> english;
std::vector<std::string> chinese;

auto future1 = std::async(std::launch::async, reader, std::ref(english), std::ref(fin));
auto future2 = std::async(std::launch::async, reader, std::ref(chinese), std::ref(fin2));

future1.wait();
future2.wait();

// Here all lines from fin will be in the vector english
// and all lines from fin2 will be in the vector chinese

处理我真的不能给你任何代码,甚至是伪代码,因为只有你知道数据应该如何处理。

参考资料:

另外,不要盲目使用上面的代码。首先它没有经过测试,它可能会产生构建错误或根本不起作用,但应该足以让您了解如何继续。请尝试理解我展示的代码实际上在做什么。阅读链接的参考资料、实验,最重要的是 benchmark 看看它是否比您当前的代码更好。就像我说的,性能可能会有所不同,甚至更差,具体取决于磁盘类型和文件存储在磁盘上的位置。

【讨论】:

  • @yihanghwang 我添加了一些用于读取文件的示例代码。请继续阅读其余文字,不要盲目复制。
猜你喜欢
  • 2021-06-04
  • 2021-06-02
  • 2021-11-09
  • 1970-01-01
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多