2011-03-04 128 views
0

我存储我的数据在使用fprintf("%f\t%f\t%f\t%f\t%f\t%f\n",p1,p2,p3,p4,p5,p6);替代更快的方法fscanf在c + +?

一个文本文件中有100,000个条目,当我读到他们使用

while(!EOF) 
    fscanf("%f %f %f %f %f %f "&p1,&p2,&p3,&p4,&p5,&p6); 

其花费很长的时间。

任何建议阅读速度更快? 在此先感谢。

回答

3

阅读他们到字符串缓冲区然后解析字符串 - 如果你坚持使用“C”见与fgets()和sscanf()

+0

您可能会看到性能上的好处,您可以自己分析字符串。 fscanf(),sscanf()必须在每次调用时动态解释格式化字符串。可能值得测量,如果这是瓶颈 – seand 2011-03-04 03:32:58

1

您应该使用fstream。在对象中创建一个fstream,如fin,然后以与使用cin相同的方式输入数据信息。您可以使用iomanip库来获得更好的格式。

0

fscanf太慢的原因主要是因为从硬盘中获取内存很慢。使用您发布的代码,从文件中提取一行文本,然后使用您提供的格式进行分析。这导致大量的文件一次获取小块。这是低效的。

与其他任何类型的存储器读取操作一样,解决方案是在给定时间读取较大的块,然后对检索到的块进行操作。换句话说,你应该把文件的全部内容转储到RAM然后处理它。为了达到这个目的,你可以使用一个stringstream。基本上,将整个文件读入一个字符串流将导致从硬盘驱动器检索内存的数量少得多(理论上,它只会在一次操作中传输整个文件)。然后,可以像使用其他输入流一样使用stringstream。

实际上,找到一种避免在任何时间关键或CPU密集型过程中执行任何文件I/O的方法可能会更合理。无论是在之前还是之后,尽量不要在循环中间进行。例如,如果将所有数据加载到数组/矢量中,然后处理数组/矢量,那么从文件加载数据需要多少时间,因为您在开始任何时间关键处理之前执行该数据的数据。 PS:由于你使用了fscanf(),我猜你可能正在寻找一种C风格的解决方案,而不是像fstream和stringstream这样的C++标准库。对不起,我不能给你任何暗示,想要坚持C函数是我很久以前克服的一个问题,并且希望你也做了或将尽快这样做。

+0

不会被缓冲流? – seand 2011-03-04 04:23:22

+0

这取决于实现。根据我的经验,没有。可以肯定的是,如果您知道将所有内容缓冲到内存会更高效,请自己动手。 fstream的实现是一种万能的。在任何情况下它都不能缓冲到RAM中,所以如果你没有明确地获取整个内存块,你很难假定它会这样做。 – 2011-03-04 04:47:51