内存映射文件、托管映射文件和偏移指针

2023-12-31

我对 Boost 库(适用于 Windows)的术语有点困惑。我想做的很简单;在磁盘上创建一个文件(>50 GB 的大文件),分别为写入和读取操作进行一些映射。

例如,首先映射 1 GB 部分用于写入,然后将其刷新到硬盘驱动器并获取新部分,依此类推,而读取器应用程序映射文件的不同部分并执行读取操作而不更改任何内容(无编辑)。

我正在阅读 boost 的文档(1.47.0 版本,因为我们允许使用这个版本),但我不明白何时使用内存映射文件方法如:file_mapping、management_region 和托管地图文件:例如 basic_managed_mapped_file 和 Offset_Ptr。

谁能告诉我内存映射文件和托管映射文件之间有什么区别以及它们的用途是什么?

如果可能的话,一些示例代码也会非常适合这些和 Offset_ptr 。

确实谢谢你...


您可以使用managed_mapped_file从内存映射文件透明地分配。

这意味着,出于所有实际目的,您通常不需要重新划分内存区域。无论如何,这都是虚拟内存,因此分页负责在需要的时间加载正确的位。

显然,如果存在大量碎片或访问“跳跃”,那么分页可能会成为性能瓶颈。在这种情况下,请考虑细分为池并从中分配。)_

Edit刚刚注意到 Boost IPC 在下面对此有支持隔离存储节点分配器 http://www.boost.org/doc/libs/1_55_0/doc/html/interprocess/allocators_containers.html#interprocess.allocators_containers.stl_allocators_segregated_storage and 自适应池节点分配器 http://www.boost.org/doc/libs/1_55_0/doc/html/interprocess/allocators_containers.html#interprocess.allocators_containers.stl_allocators_adaptive。还有关于这些存储池的实现的注释here http://www.boost.org/doc/libs/1_55_0/doc/html/interprocess/architecture.html#interprocess.architecture.allocators_containers.implementation_segregated_storage_pools.

这是一个简单的起点,创建一个 50Gb 文件并在其中填充一些数据:

#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>

#include <boost/container/flat_map.hpp>
#include <boost/container/flat_set.hpp>

#include <boost/interprocess/managed_mapped_file.hpp>
#include <boost/container/scoped_allocator.hpp>
#include <boost/interprocess/containers/string.hpp>
#include <boost/interprocess/containers/vector.hpp>
#include <boost/interprocess/sync/named_mutex.hpp>
#include <boost/interprocess/sync/scoped_lock.hpp>

namespace bip = boost::interprocess;
using mutex_type    = bip::named_mutex;

struct X
{
    char buf[100];
    double rate;
    uint32_t samples[1024];
};

template <typename T> using shared_alloc  = bip::allocator<T,bip::managed_mapped_file::segment_manager>;
template <typename T> using shared_vector = boost::container::vector<T, shared_alloc<T> >;
template <typename K, typename V, typename P = std::pair<K,V>, typename Cmp = std::less<K> >
                      using shared_map    = boost::container::flat_map<K, V, Cmp, shared_alloc<P> >;

using shared_string = bip::basic_string<char,std::char_traits<char>,shared_alloc<char> >;
using dataset_t     = shared_map<shared_string, shared_vector<X> >;

struct mutex_remove
{
    mutex_remove() { mutex_type::remove("7FD6D7E8-320B-11DC-82CF-39598D556B0E"); }
    ~mutex_remove(){ mutex_type::remove("7FD6D7E8-320B-11DC-82CF-39598D556B0E"); }
} remover;

static mutex_type mutex(bip::open_or_create,"7FD6D7E8-320B-11DC-82CF-39598D556B0E");

static dataset_t& shared_instance()
{
    bip::scoped_lock<mutex_type> lock(mutex);
    static bip::managed_mapped_file seg(bip::open_or_create,"./demo.db", 50ul<<30); // "50Gb ought to be enough for anyone"

    static dataset_t* _instance = seg.find_or_construct<dataset_t>
        ("DATA")
        (
         std::less<shared_string>(), 
         dataset_t::allocator_type(seg.get_segment_manager())
        );

    static auto capacity = seg.get_free_memory();
    std::cerr << "Free space: " << (capacity>>30) << "g\n";

    return *_instance;
}

int main()
{
    auto& db = shared_instance();

    bip::scoped_lock<mutex_type> lock(mutex);
    auto alloc = db.get_allocator().get_segment_manager();

    std::cout << db.size() << '\n';

    for (int i = 0; i < 1000; ++i)
    {
        std::string key_ = "item" + std::to_string(i);
        shared_string key(alloc);
        key.assign(key_.begin(), key_.end());
        auto value = shared_vector<X>(alloc);
        value.resize(size_t(rand()%(1ul<<9)));
        auto entry = std::make_pair(key, value);

        db.insert(std::make_pair(key, value));
    }
}

注意它写了一个sparse文件50G。提交的实际大小取决于那里的一些随机性。我的运行结果大约是 1.1G:

$ du -shc --apparent-size demo.db 
50G demo.db

$ du -shc demo.db 
1,1G    demo.db

希望这可以帮助

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

内存映射文件、托管映射文件和偏移指针 的相关文章

随机推荐

  • 为什么需要为 iTerm 中的每个新 shell 获取 .zshrc 源?

    在过去的 3 年里 我每天都将 Iterm2 与 zsh 一起使用 但我有了一台新计算机 不得不重新设置它 问题是当我跑步时 zshrc它工作正常 但我必须在打开的每个新终端窗口上执行此操作 不是一个好的经历 我注意到我没有任何bashrc
  • GWT - FlowPanel 和调整大小

    我有一些Composite我的应用程序中使用的小部件FlowPanel作为他们的主要元素 我想知道的是 我是否需要为此以任何方式调整大小 FlowPanel不实施RequiresResize 所以我不能使用ResizeComposite 但
  • 如何在数据帧中引用广播变量

    我用的是spark1 6 我尝试广播 RDD 但不确定如何访问数据帧中的广播变量 我有两个数据框员工和部门 员工数据框 Emp Id Emp Name Emp Age 1 john 25 2 David 35 部门数据框 Dept Id D
  • 无法下载任何源列表 - android SDK

    我正在尝试从 Sdk Manager 下载平台工具 但当我跑步时 C android sdk cmdline tools tools bin gt sdkmanager platform tools platforms android 28
  • 如何删除两个span元素之间的多余空间?

    我想删除这两个元素之间的额外空间 我尝试过但做不到 这是边距崩溃的问题吗 如何解决这个问题 我怎样才能删除多余的空间 这是我的 HTML 和 CSS body width 250px height 100px background F2F2
  • MsDeploy 远程处理执行清单两次

    I have 为 msdeploy 创建了一个清单以 停止 卸载 复制 安装和启动 Windows 服务 从清单创建了一个包 对远程服务器上的包执行 msdeploy 问题 它执行整个清单两次 尝试过 我修改了 waitInterval 和
  • Laravel 中的分页不起作用

    当我投入我的观点时 问题 gt 链接 我没有看到分页样式 并且该页面不像我在控制器中放入的那样每页需要 6 个帖子 我的职位控制器 类 QuestionsController 扩展控制器 Display a listing of the r
  • 为 LaTeX 编写功能的起点是什么?

    我对它很陌生 但知道它无法处理我需要的特殊东西 我想开发 LaTeX 的功能 问题 有一种东西叫做 TeX 然后是乳胶 然后是 KOMA Script 那么 这三个中的哪一个实际上是驱动所有这些东西的 底层引擎 这是 TeX TeX 不仅是
  • React-Native 中 Android 和 iOS 的图像大小

    在制作iOS应用程序时 我们通常会提供 x 2x 3x图像 根据我对 Android 的了解 大约有六种不同的尺寸 我已经开始研究react native并遇到了图像问题 我的问题是 我是否需要提供所有不同尺寸的图像 即通过结合 iOS 和
  • XML 到制表符分隔文本

    需要XML XSLT专家的帮助 我有 2 个以 XML 格式从系统导出的示例记录 如下所示 我喜欢使用 XSLT 将数据转换为制表符分隔的文本 如下所示https docs google com spreadsheet ccc key 0A
  • 查询@xml变量以获取行集

    我有一个 xml 数据 如下所示 DECLARE XmlContent XML SET XmlContent
  • 理解嵌套列表理解[重复]

    这个问题在这里已经有答案了 我想了解嵌套列表理解 下面 我列出了一个列表理解表达式及其 for 循环等效项 我想知道我的理解是否正确 例如 min row i for row in rows max row i for row in row
  • 使用 datetime64 将字符串转换为 np.array,而不是使用 Pandas

    我正在寻找一种方法 将以 YYYYmmdd 格式给出的日期转换为 dtype datetime64 的 np array 日期存储在另一个 np array 中 但 dtype float64 我正在寻找一种方法来避免熊猫来实现这一目标 我
  • 在erlang接收语句中引入“保存队列”的目的是什么

    我是 erlang 新手 正在学习 Joe Armstrong 的 Programming Erlang 教程 我对8 6中选择性接收中提到的 保存队列 感到困惑 如果消息根本不匹配 为什么不直接丢弃呢 放回邮箱以便后续处理的目的是什么 如
  • 为什么我的 Netbeans Xdebug 会话在一段时间不活动后会超时

    我喜欢 Netbeans 帮助我调试 Magento 应用程序的方式 在 Win 7 64 位上的 XAMPP 中 但我注意到连接在一段时间后似乎超时 断点不再被命中 我必须重新启动调试会话 这很烦人 关于如何延长或禁用调试超时有什么建议吗
  • Tensorflow 中的 RBF 网络有问题吗?

    我正在使用 Tensorflow 开发 RBF 网络 但在第 112 行出现此错误 内容如下 ValueError Cannot feed value of shape 40 13 for Tensor Placeholder 0 whic
  • 使用四元数平滑旋转

    四元数不仅可以描述旋转 还可以描述方向 即从初始 零 位置开始的旋转 我希望模拟从一个方向到另一个方向的平滑旋转 我计算了起始方向startOrientation和末端方向endOrientation并希望将中间方向描述为startOrie
  • 既然有String,为什么还要使用StringBuilder?

    我刚刚遇到StringBuilder第一次使用并感到惊讶 因为 Java 已经拥有非常强大的功能String允许追加的类 为什么要一秒钟String class 我在哪里可以了解更多信息StringBuilder String不允许追加 您
  • Javascript 中的几乎所有内容为何都是对象?

    我在许多 JavaScript 介绍中读到过很多这一点 我只是不明白 我始终认为对象是具有方法和属性的东西 我理解数组 因为它有键值对 字符串 或 数字 或 函数 怎么样 上面列出的这些东西对我来说似乎就像函数 这意味着你输入一些东西 你就
  • 内存映射文件、托管映射文件和偏移指针

    我对 Boost 库 适用于 Windows 的术语有点困惑 我想做的很简单 在磁盘上创建一个文件 gt 50 GB 的大文件 分别为写入和读取操作进行一些映射 例如 首先映射 1 GB 部分用于写入 然后将其刷新到硬盘驱动器并获取新部分