我有一个文件解析器,它将文件加载为文件映射对象,然后根据调用者的需求映射区域。 可以在本地或通过网络访问文件。
此文件读取是连续的。
我有2种方法-
方法1
创建一个file_mapping对象,例如f。
使用以下方法创建映射区域 “ f”,一次只有一个被映射的区域处于活动状态。
方法2
每次创建一个新的file_mapping对象(用于同一文件)
方法2基于以下假设:file_mapping设计用于进程间通信,因此为同一文件创建多个file_mapping对象将不是问题。
在本地访问文件后,会显示性能基准, 两种方法的时间都差不多(对于3GB的文件)
但是,当通过网络访问文件时, 方法2的执行速度是方法1的〜5倍。
在这两种方法中,在创建新的映射区域之前,已映射区域都会被破坏。
方法2的唯一区别是为每个mapd_region创建并破坏了file_mapping对象。
基准标记,用于顺序文件读取操作的步骤:
-文件大小:3GB
-创建的映射区域数:8600
-Mapped Region Size:可变,范围在9KB-900KB
-映射的区域访问:所有区域在访问后立即访问 创作。
映射区域创建频率:一个接一个 循环,对从映射区域提取的数据进行一些处理。 尽管深度最大,但处理涉及递归结构填充 10.它不是很密集。
我想了解:
为什么时间安排有如此大的差异?
创建file_mapping对象时会发生什么?
当创建一个mapped_region对象时会发生什么?
操作系统在file_mapping期间是否搜索大量内存 创建还是在mapd_region创建期间?
文件数据何时实际加载到主存储器中?
非常感谢。
答案 0 :(得分:0)
如果不知道基准测试过程(即您创建mapped_region
对象的频率,映射的部分有多少以及实际访问的部分),就无法回答这个问题。
还不清楚在实现中文件映射对象(boost::file_mapping
)是否也显式打开文件句柄,或者文件是否由您打开。
我只能猜测在网络文件系统中创建文件和映射对象可能需要更多的PC间通信(用于同步)。