boost :: file_mapping对象的创建成本?

问题描述 投票:2回答:1

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

此文件读取是顺序的。

我有两种方法 -

方法1

创建一个file_mapping对象,比如f。

使用'f'创建映射区域,其中一次只有一个mapped_region处于活动状态。

方法2

每次创建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对象时究竟发生了什么?

OS在创建file_mapping期间或在创建mapped_region期间是否搜索了大量内存?

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

非常感谢。

c++ performance boost ipc filemap
1个回答
0
投票

在不知道你的基准程序的情况下回答这个问题是不可能的,即你创建mapped_region对象的频率,映射部分有多大,以及实际访问它们的哪些部分。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.