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

时间:2019-03-20 06:31:23

标签: c++ performance boost ipc filemap

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

此文件读取是连续的。

我有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创建期间?

         

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

  

非常感谢。

1 个答案:

答案 0 :(得分:0)

如果不知道基准测试过程(即您创建mapped_region对象的频率,映射的部分有多少以及实际访问的部分),就无法回答这个问题。

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

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