gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:25:11 25 4
gpt4 key购买 nike

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

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 行,这样我可以加快程序运行时间,代码只是逐行处理,我该如何重写它??

最佳答案

至于你的问题,使用两个线程读取文件,每个线程一个文件,到两个 vector 中。然后您可以按照自己的方式处理 vector 。

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


关于文件读取的注意事项:即使您使用线程进行读取,性能实际上可能会变慢。这完全取决于文件的存储位置。如果文件都在单个机械硬盘驱动器上,则性能可能会恶化,因为磁盘必须来回跳转才能读取文件。如果文件位于两个单独的磁盘或 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

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

引用资料:

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

关于c++ - 如何使用 C++ 逐行并行处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38408176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com