如何使用c ++逐行并行处理

时间:2016-07-16 05:45:12

标签: c++ parallel-processing

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

Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);

两个文件包含每个文件超过5000行,我想一次处理超过2行,我可以加快程序运行时间,代码只是逐行处理,我怎么能重写它? / p>

1 个答案:

答案 0 :(得分: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

处理我真的无法为您提供任何代码,甚至伪代码,因为唯一知道如何处理数据的人就是您。

参考文献:

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