每次需要时,将整个文件从磁盘复制到内存中,以处理或读取文件中的数据,直到文件全部读取
Copy the whole file from disk to memory to process or read data from file each time i need until the file is all read
我正在做一些非常关心效率的事情。有数千个文件,每个文件的大小多达300M。每个文件至少包含50万个项目。我的工作是尽可能快地处理每一项。物理内存大小不是问题。那么,将整个文件复制到内存中,并从内存中获取每一项,而不是从磁盘中获取每项,我会从中受益吗?还有其他方法可以节省IO过程中的时间吗?非常感谢。
您可以使用mmap(2)、madvise(2),posix_fadvise(1)和readahead(2)系统调用(请注意,readahead
是Linux特定的并且是阻塞的,您可能需要提前调用它,或者在单独的线程中调用它)。
您可能不太在乎:只需提前读取每个200Mb的文件,在处理它之前几秒钟,就足够了。内核文件系统和磁盘缓存做了很多工作;如果有大量的RAM数据,那么这些数据就已经在存储器中了。
你没有告诉我们你的程序是一个持久的过程,还是你通过一些重复的脚本在每个大文件上调用相同的程序来驱动它。
系统配置和硬件确实很重要。您可以使用大块(例如16Kb或64Kb)配置文件系统(在mke2fs
时间)。如果你买得起,固态硬盘会带来很多。
您还可以设计您的应用程序来仔细使用一些巧妙设置的数据库。
对于初学者:
std::vector<char> input;
std::ifstream file("filename.txt")'
// maybe find file size and do a reserve on input
std::copy(std::istream_iterator<char>(file), std::istream_iterator<char>()
std::back_inserter(input));
如果这实际上对你来说不够快,那么内存映射文件通常会减少很多IO开销。
Iostream库提供了可移植内存映射文件一个现代化的界面,真的很快。
无论如何:首先尝试简单的解决方案,构建程序以将文件IO过程与解析器和实际处理分离,然后优化实际昂贵的部分。这样的程序结构还将允许易于实现生产者/消费者并行性。
一个重要的部分也是你的items
是什么。它们可以直接映射到struct
中吗?还是必须进行处理。如果是,那么实际的解析有多复杂?
- 正在将csv文件读取为双精度矢量
- 将从格式化文本文件读取的文本数据存储到链表
- C++ 读取文件读取文件不正确
- 使用对象文件读取三角形数据网格
- 如何减慢从 BVH 文件读取的 opengl 动画?
- 从文件读取,并写入函数C++中的数组
- 从对象C++中的文件读取内容时出现分段错误
- 从文件读取并通过矢量输出到控制台
- 尝试将字符串从文件读取到无符号字符向量中
- 如何将文本文件读取到二维数组中并以 c++ 打印
- 简化文件读取的函数
- 如何将逗号分隔的文件读取为 2D int 数组?
- 在 c++ 中将数据从文件读取到队列中
- 'std::wstring_convert'尽可能多地转换(从 UTF8 文件读取块)
- C++,从文件读取到结构,然后读取到向量(结构被推入向量太多次,而不仅仅是一次)
- 文件读取C++包括空格键
- 从文件读取时未将值推回矢量
- 从文件 C++ 读取时的无限循环
- 从同一文件读取和写入?
- 从.txt文件读取到C++中的双精度向量