2016-07-16 68 views
1

我想加快程序处理 这里平行的线加工生产线的代码:如何用C++

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

+2

首先,你应该阅读[为什么iostream :: eof内循环条件被认为是错误的?](http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-条件考虑的,是错误的)。 –

回答

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 

我真的不能给你任何代码,甚至没有伪码处理的读数可能实现,因为谁知道如何数据的唯一一个应被处理的是你。

参考文献:

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

+0

任何示例代码? @Joachim Pileborg –

+0

@yihanghwang我已经添加了一些示例代码来读取文件。请继续阅读其他文字,不要盲目复制。 –