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

Posted

技术标签:

【中文标题】boost::file_mapping 对象的创建成本?【英文标题】:Cost of creation of boost::file_mapping object? 【发布时间】:2019-03-20 06:31:22 【问题描述】:

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

这个文件读取是顺序的。

我有两种方法 -

方法 1

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

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

方法 2

创建新的 file_mapping 对象(对于同一个文件),每次 mapped_region 将被创建。

方法 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 对象时究竟会发生什么?

操作系统是否在文件映射期间搜索大块内存 创建或在 mapped_region 创建期间?

文件数据何时真正加载到主存中?

非常感谢。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

我将在我的问题中添加这些详细信息 file_mapping 对象打开文件句柄。我没有通过任何其他调用打开文件。

以上是关于boost::file_mapping 对象的创建成本?的主要内容,如果未能解决你的问题,请参考以下文章

JAVA创建对象有哪几种方式 ???

JS对象的创建

有几种创建对象的方法

设计模式代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 )

InetAddress创建对象的方法

javascript构造函数及原型对象