每次需要时,将整个文件从磁盘复制到内存中,以处理或读取文件中的数据,直到文件全部读取

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

本文关键字:文件 读取 全部 内存 处理 数据 磁盘 复制      更新时间:2023-10-16

我正在做一些非常关心效率的事情。有数千个文件,每个文件的大小多达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中吗?还是必须进行处理。如果是,那么实际的解析有多复杂?