逐行读取字符串文本文件的最快方法
Fastest way to read a text file of strings line by line
可能重复:
在C++中实现高性能顺序文件I/O的最快方法是什么?
我环顾四周,仍然不确定这个问题的答案。
当从每行都有任意单词的文本文件中读取时,从该文件中读取单词的最快方法是什么?项目的范围要求以最快的速度读取文件。
在Windows 7。无跨平台考虑。
编辑:请记住,这个文件读取是一次性的,它不会再次被读取,也不会被写入。程序启动,从文件中读取,并将其推入数据结构,loadFile()函数再也不会被调用。
事实上,您已经标记了"多线程",这让我认为您正在考虑对文件进行线程读取。我真的建议您重新考虑,因为这会导致非常棘手的并发问题出现。您必须深入研究互斥、信号量和进程间通信的兔子洞,这可能会让即使是最优秀的开发人员也为线程之前的美好时光而哭泣。
你有一个.txt文件,文件中有单词要读。你必须打开文件,你必须阅读每一个单词。没有办法绕过它。除非你愿意将文本文件处理成一个用于并发访问的数据结构(intel TBB有一些不错的),否则你最好的选择可能是只进行单线程读取,并在所有内容都是本地的之后将数据传给其他线程。
内存映射文件或以固定大小的大块读取文件并处理内存中的数据。
根据我对您的问题的理解,您的目标是读取一个单词文件,并将每个单词插入到一些数据结构中。您希望此read+插入尽可能快。(我不会争论这样做的理由或智慧,我只会接受这是一个要求。:-)如果我的理解是正确的,那么也许另一种方法是编写一个实用程序,读取单词文件,将它们插入数据结构中,然后将该数据结构序列化为文件(例如BLOB.dat)。然后,您的主程序将把BLOB.dat反序列化为所需的数据结构。从本质上讲,您可以将word文件预处理为一些中间二进制格式,这些格式可以最有效地加载到数据结构中。或者,在你的情况下,这会是作弊吗??
Donot内存映射文件。正如Raymond Chen所解释的,这扼杀了顺序访问优化。由于磁盘速度较慢,预取将使磁盘保持繁忙状态,从而提高吞吐量。
您的文件可能会以最快的速度加载。毕竟,大多数文件操作都只调用相同的系统调用。据说IOstreams比cstdio慢,但我建议您在这里使用分析工具来找到最好的选项集。调整缓冲区大小以满足您的需要。但是,不幸的是,对于大文件,您将花费大部分时间等待IO,只有很小的时间用于处理。调整装载方式不会给你带来太多好处。
但既然你要等待,就要确保你明智地利用时间。
生成一个线程,以便在应用程序启动时立即加载文件,并利用这段时间执行其他操作。如果您需要数据来执行任何操作,请将读取文件的块传递给其他线程进行处理。
- 如何使用curlpp通过POST方法上传文件和json数据
- 一种在C++中读取TXT配置文件的简单方法
- 在 cpp 文件中隐藏采用模板参数引用的方法
- 在C++中包含原型文件的正确方法是什么?
- 通过比较C++中的行在 txt 文件中搜索的最简单方法是什么?
- 不带预处理器的调用方法/文件的文件名/行号
- 引用文件的适当方法是什么?
- 在文件中写入而不是在 c++ 中使用 "<<" 的替代方法?
- 查找定义我的 C/C++ 函数/宏的文件比'grep'更简单的方法
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?
- 在C++中创建文件夹选取器对话框的最简单方法是什么?
- C++:std::ofstream 方法 open() 在第二次迭代时擦除打开的 ifstream 文件
- 如何使用 C/C++ 和 system() 系统调用以外的其他方法在 Linux 中获取文件功能?
- 创建进行生产构建并创建调试信息的C++生成文件的最佳方法?
- 是否有正确的方法对生成文件中的对象文件使用模板命令?(C++)
- 将位字符串转储到二进制文件的最佳方法是什么
- 在目录中查找所有.cpp.h文件(include,src等)的传统方法
- 通过boost asio iostream下载大文件的最快方法是什么?
- LNK2019 在文件中调用静态成员的方法时出错.cpp
- 在 *.cpp 文件中实现的 c++ 函数/方法永远不会内联扩展吗?