在内存映射或读取文件之间动态决策

Dynamically deciding between memory mapping or reading a file

提问人:Juergen 提问时间:2/24/2023 最后编辑:Juergen 更新时间:2/25/2023 访问量:67

问:

文件的内存映射可保存数据副本,因此对于大文件速度更快。
读取文件可以节省对 MMU 的操作,因此对于小文件来说速度更快。
读取大量文件时,为每个文件选择最佳方法可能会有所不同。

我是否需要对文件大小限制进行硬编码才能做出此决定,或者是否存在 一种“最佳实践”(启发式)算法,用于从以下位置推断决策文件大小 在英特尔的 Linux 上运行时运行时的一些系统变量?
有问题的文件将被线性读取(无随机访问),并且大小非常不同。

编辑:我不愿意实现一些基准算法,因为 和 之间的差异很小,即使有大量文件需要处理,也不能证明这样的开销是合理的。mmapread

第二次编辑:这是一个关于良好编码习惯的一般问题,与某些特定机器上的某些特定文件集无关。
想象一下,我想提高性能(实际上并非如此):
如何有效地实现对许多以前未知文件的线性读取?
grep

Linux 性能 IO

评论

0赞 stark 2/24/2023
这回答了你的问题吗?mmap() 与读取块
0赞 Juergen 2/24/2023
@stark,不,它没有,因为这个问题与确定决策文件大小无关。它不是一次性的线性阅读。
1赞 rustyx 2/24/2023
"我不愿意实现一些基准算法,因为 mmap 和 read 之间的差异很小,即使有大量文件需要处理,也无法证明这样的开销是合理的。- 这没有意义。当然,在基准测试后,您会看到差异。如果没有,那么你就会知道这实际上并不重要。只需确保多次运行文件即可减少缓存/磁盘访问的影响。
0赞 Juergen 2/24/2023
@rustyx,当编写一个应该在不同机器上运行的通用程序时(大或小内存、服务器或笔记本电脑、虚拟机或真实硬件、不同数量的内核、旧的或新的架构......),在切换时使用不同的决策文件大小可能是合理的。另一方面,将基准纳入通用程序是不合理的。

答:

1赞 Synopsis 2/24/2023 #1

您正在请求一种学习算法,需要具有一些起始值,例如基于硬编码的大小,然后测量例如读取固定数据堆所需的时间。

系统无法提供这样的信息,因为它无法猜测您的代码在打开文件之前将要做什么。它无法知道,你只是按顺序阅读。

您必须编写一些测量算法,并将结果反馈给您决定的 mem 映射或打开某些文件。结果可以以某种方式持久化,而不必每次都从头开始,但这些原因的测量取决于机器。

评论

0赞 Juergen 2/24/2023
我不愿意实施基准测试,因为 和 之间的差异很小,即使有大量文件需要处理,也不能证明这样的开销是合理的。我想要的要么是硬限制(可能是 128 kB),要么是一些简单的算法,例如“如果文件大于系统可用内存的 1%,请使用 mmap”或“如果文件大于页面大小乘以 CPU 数量,则使用 mmap”或其他任何内容。mmapread