2

我有一个文件解析器,它将文件加载为文件映射对象,然后根据调用者的需求映射区域。这些文件可以在本地访问,也可以通过网络访问。

此文件读取是顺序的。

我有两种方法-

方法一

创建一个 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 期间搜索大块内存?

文件数据何时实际加载到主存中?

非常感谢。

4

1 回答 1

0

如果不知道您的基准测试程序,即创建mapped_region对象的频率、映射的部分有多大以及实际访问了其中的哪些部分,就不可能回答这个问题。

也不清楚在您的实现中文件映射对象 ( boost::file_mapping) 是否也显式地打开文件句柄,或者文件是由您打开的。

我只能猜测在网络文件系统中创建文件和映射对象可能需要更多的 PC 间通信(用于同步)。

于 2019-03-20T06:53:16.807 回答