在C ++中,如何读取多个线程的文件?

时间:2013-07-31 13:39:21

标签: c++ python multithreading readfile

我正在使用Windows 7,64位,8核的VS2012从本地硬盘读取.csv文件。

我正在阅读的文件有50,000多行,每行有200多个属性,因此读取数据并将它们提供给相应的变量非常耗时。因此,我想知道我是否可以使用多线程来加速它,每个线程都会读取文件的一部分。

我已经开始搜索它了,并且发现有人说,因为硬盘驱动器不是多线程的,所以使用多个线程来实现这一目标将其放慢速度这是真的吗?

如果可以阅读多个帖子的文件,有人可以给我一个我可以学习的例子吗?

此外,是否可以明确地将线程或任务分配给CPU核心?

最后一个问题:我用Python阅读了同一个文件,它已在几秒钟内完成。 我是否知道为什么Python读取速度比C ++快?

1 个答案:

答案 0 :(得分:2)

读取文件需要在任何语言或操作系统中进行系统调用,这意味着调用底层操作系统,并等待它将文件内容放入内存中(假设您通过操作系统的安全检查)所有这一切)。多线程读取文件确实会减慢你的速度,因为你会制作更多的系统调用,让你不再执行程序并将控制权移交给操作系统。

因此,最好的建议是hyde - 如果需要,可能将文件解析为多个线程。如果你能够在几秒钟内解析一个大的文件,我会说这不值得。例如,如果您正在运行图形应用程序,那么您肯定希望为文件加载保留一个单独的线程,这样您就不会冻结UI。

关于速度问题,我猜有两个主要问题。首先,我怀疑python默认通过内存缓冲区读取它的文件,这会加快执行速度。如果您可以缓冲文件读取(这样可以减少系统调用),您可能会看到一些性能提升。另一个问题是您在Python和C ++中使用哪些数据结构来加载/解析数据。在不知道您的代码的情况下,我无法提出具体的建议,但花一点时间研究/思考适用于您的程序的不同数据结构可能会有用。请记住,Python和C ++的数据结构具有非常不同的性能配置文件,因此在Python中运行良好的可能是C ++中更糟糕的选择。

编辑:在http://www.cplusplus.com/reference/

的C ++ STL中使用文件缓冲的简单示例
 // read a file into buffer - sgetn() example
 #include <iostream>     // std::cout, std::streambuf, std::streamsize
 #include <fstream>      // std::ifstream

 int main () {
   char* contents;
   std::ifstream istr ("test.txt");

   if (istr) {
     std::streambuf * pbuf = istr.rdbuf();
     std::streamsize size = pbuf->pubseekoff(0,istr.end);
     pbuf->pubseekoff(0,istr.beg);       // rewind
     contents = new char [size];
     pbuf->sgetn (contents,size);
     istr.close();
     std::cout.write (contents,size);
   }
   return 0;
 }
相关问题