逐行读取字符串文本文件的最快方法

时间:2012-02-20 04:33:56

标签: c++ windows performance file-io

  

可能重复:
  What is the Fastest Method for High Performance Sequential File I/O in C++?

我已经看了一下,我仍然不确定这个问题的答案。

当读取每行上带有任意单词的文本文件时,从该文件中读取单词的绝对最快方法是什么?项目范围要求尽可能快地读取文件。

在Windows上使用Visual Studio 7.无需跨平台考虑。

编辑: 请记住,这个文件读取是一次性的事情,它不会被再次读取,也不会被写入。程序启动,从文件读取,将其推送到数据结构,并且永远不再调用loadFile()函数。

5 个答案:

答案 0 :(得分:4)

你有这个标记为“多线程”的事实让我觉得你正在考虑对文件进行线程化读取。我真的建议你重新考虑,因为这会导致非常毛茸茸的并发问题,让他们的丑陋头脑。你将不得不深入研究互斥体,信号量和进程间通信的兔子洞,这可以使最好的开发人员在线程之前的美好时光中哭泣。

您有一个.txt文件,并且该文件中有单词可供阅读。你必须打开文件,你必须阅读每个单词。没有绕过它。除非您愿意将文本文件处理为为并发访问而构建的数据结构(英特尔TBB有一些好的),否则最好的办法就是只需执行单线程读取并在一切都是本地后将数据传递给其他线程。

答案 1 :(得分:2)

内存映射文件或以大型固定大小的块读取它并处理内存中的数据。

答案 2 :(得分:1)

据我了解你的问题,你的目标是阅读一个单词文件并将每个单词插入一些数据结构中。您希望此读取+插入尽可能快。 (我不会辩论这个的理由或智慧,我只是接受这是一个要求。:-)) 如果我的理解是正确的,那么可能另一种方法是编写一个实用程序,它将读取单词文件,将它们插入到数据结构中,然后将该数据结构序列化为一个文件(例如BLOB.dat,例如)。然后,您的主程序将BLOB.dat反序列化为您需要的数据结构。基本上,您将单词文件预处理为一些中间二进制格式,可以最有效地加载到您的数据结构中。或者这会在你的场景中作弊??

答案 3 :(得分:0)

内存映射文件。作为Raymond Chen explains,这会导致顺序访问优化。由于磁盘速度较慢,因此预取将使磁盘保持繁忙,从而提高吞吐量。

答案 4 :(得分:0)

您的文件可能会尽可能快地加载自己。毕竟大多数文件操作都只是调用相同的系统调用。据说IOstreams比cstdio慢,但我建议你在这里使用一个分析工具来找到最好的选项集。调整缓冲区大小以满足您的需要。但是,遗憾的是,对于大型文件,大多数情况下您将花费等待IO,只需要很少的时间来处理。调整加载方式不会对你造成太大影响。

但是,既然你要等待,请确保你明智地利用你的时间。

在应用程序启动时产生一个线程立即加载文件,并使用该时间来执行其他任何操作。如果您需要数据执行任何操作,请将读取文件的块传递给另一个要处理的线程。