我有一个文件解析器,它将文件加载为文件映射对象,然后根据调用者的需求映射区域。这些文件可以在本地访问,也可以通过网络访问。
此文件读取是顺序的。
我有两种方法-
方法一
创建一个 file_mapping 对象,比如 f。
使用“f”创建映射区域,其中一次只有一个 mapped_region 处于活动状态。
方法二
每次要创建 mapped_region 时,创建新的 file_mapping 对象(对于同一个文件)。
方法 2 基于 file_mapping 是为进程间通信而设计的假设,因此为同一个文件创建多个 file_mapping 对象不会成为问题。
当文件在本地访问时,性能基准显示,两种方法的时间相似(对于 3GB 文件)
但是,当通过网络访问文件时,方法 2 的执行速度比方法 1慢约 5 倍。
在这两种方法中,mapped_region 都会在创建新的之前被破坏。
方法 2 的唯一区别是 file_mapping 对象为每个 mapped_region 创建和销毁。
顺序文件读取操作的基准标记程序:
- 文件大小:3GB
-创建的映射区域数:8600 -映射区域
大小:可变,在 9KB - 900KB 范围内变化 -
映射区域访问:所有区域在完成后立即访问创建。
-映射区域创建频率:一个接一个地循环,对从映射区域提取的数据进行一些处理。处理涉及递归结构填充,尽管深度最大为 10。它不是很密集。
我想了解:
为什么时间差这么大?
创建 file_mapping 对象时究竟会发生什么?
当一个 mapped_region 对象被创建时究竟会发生什么?
操作系统是否在创建 file_mapping 或创建 mapped_region 期间搜索大块内存?
文件数据何时实际加载到主存中?
非常感谢。