Edit:在示例代码中,我最初说我正在打印到控制台。那只是示例代码,可以参考我如何完成文件I/O。实际上,我将数据存储在以后要使用的向量中。
因此,我正在使用标准文件I/O用于C ++在包含约700万条记录的CSV文件中阅读。现在,在8GB PC上大约需要80秒钟,但是我想加快这段时间。
string line;
ifstream myfile ("example.csv");
if (myfile.is_open())
{
while ( getline (myfile,line) )
{
//cout << line << '\n'; -- edit. Not printing out to console but
storing to an array
}
myfile.close();
}
由于CSV文件只有一个列,是否有一种方法可以立即快速获取所有数据,而不是通过行进行行?
我理解是,从文件到程序的传输是最长的,所以我在想是否可以从文件中存储所有数据(不确定此过程),然后立即将其全部写入C ++程序,应该加快该过程。
getline
已经将在文件流上调用基于块的缓冲读数,而您的操作系统将通过预播种进一步优化该访问模式。 (地狱,您的驱动器可能会对此变得聪明。)您的程序花费了这么长时间也就不足为奇了,但这是因为控制台输出要比文件输入慢得多(主要是因为之后需要进行一堆字体渲染)。在尝试优化IO之前,请实现要在文件上执行的实际处理[并取出控制台输出],然后看看它的速度。 打印700万行TOT他的控制台非常耗时。不知道为什么要这样做。
cout
来评论这条线,看看控制台打印的速度有多快。
阅读大量的顺序数据并不是缓冲I/O的最佳选择,因为数据复制了两次(或更多):磁盘 - >缓冲区 - >程序。
您可以通过开放/读/关闭C函数(
#include <io.h>
)使用未掩盖的I/O。这不太适合文本处理。
其他替代方案是增加C运行时库使用的缓冲尺寸。您可以玩不同尺寸以查看是否有帮助。
您可以使用我的lib
https://github.com/hima12-awny/read-csv-dataframe-cpp读取pandas python语法的csv文件。