4

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

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

我用谷歌搜索过,发现有人说,由于硬盘驱动器不是多线程的,因此使用多个线程这样做实际上会减慢它的速度这是真的?

如果可以读取具有多个线程的文件,任何人都可以给我一个可以学习的例子吗?

此外,是否可以将线程或任务显式分配给 CPU 内核?

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

4

1 回答 1

2

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

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

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

编辑:在 C++ STL 中使用文件缓冲的简单示例,来自http://www.cplusplus.com/reference/

 // 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;
 }
于 2013-08-01T15:30:03.137 回答