我使用fprintf("%f\t%f\t%f\t%f\t%f\t%f\n",p1,p2,p3,p4,p5,p6);
有100,000个条目,当我使用
读取它们时while(!EOF)
fscanf("%f %f %f %f %f %f "&p1,&p2,&p3,&p4,&p5,&p6);
它花了很长时间。
有什么建议以更快的速度阅读? 提前谢谢。
答案 0 :(得分:3)
将它们读入字符串缓冲区然后解析字符串 - 如果你坚持使用'c',请参阅fgets()和sscanf()
答案 1 :(得分:1)
您应该使用fstream
。在对象中创建fstream
,例如fin
,然后以与使用cin
相同的方式输入文件的数据信息。您可以使用iomanip
库进行更好的格式化。
答案 2 :(得分:1)
尝试使用boost.spirit。
答案 3 :(得分:0)
fscanf速度如此之慢的原因主要是因为从硬盘驱动器获取内存很慢。使用您发布的代码,从文件中提取一行文本,然后使用您提供的格式进行解析。这导致一次大量获取文件的小块。这是低效的。
与任何其他类型的内存提取操作一样,该解决方案是在给定时间获取更大的块,然后对检索到的块进行操作。换句话说,您应该将文件的整个内容转储到RAM中,然后进行处理。为此,您可以使用字符串流。基本上,将整个文件读入字符串流将导致从硬盘驱动器中检索内存的次数减少(理论上,它只会在一次操作中传输整个文件)。然后,stringstream可以像任何其他输入流一样使用。
实际上,找到一种避免在任何时间关键或CPU密集型过程中进行任何文件I / O的方法可能更为合理。要么在之前或之后做,要尽量不要在循环中间做。例如,如果将所有数据加载到数组/向量中,然后处理数组/向量,则不再需要花费多少时间从文件加载数据,因为在开始任何时间关键处理之前这样做了数据。
PS:既然你使用了fscanf(),我猜你可能正在寻找一种C风格的解决方案而不是像cstream和stringstream这样的C ++标准库。对不起,我不能给你任何暗示,想要坚持使用C函数是我很久以前克服过的一个问题,希望你也能做到或者很快就会这样做。