如何可移植地扩展使用 mmap() 访问的文件

2024-02-03

我们正在尝试改变 SQLite,一个嵌入式数据库系统, 使用 mmap() 而不是通常的 read() 和 write() 调用来访问 磁盘上的数据库文件。对整个数据使用单个大映射 文件。假设文件足够小,我们没有问题 在虚拟内存中为此寻找空间。

到目前为止,一切都很好。在许多情况下使用 mmap() 似乎更快一些 比 read() 和 write() 更重要。在某些情况下速度更快。

调整映射大小以提交写入事务 扩展数据库文件似乎是一个问题。为了延长 数据库文件,代码可以执行如下操作:

  ftruncate();    // extend the database file on disk 
  munmap();       // unmap the current mapping (it's now too small)
  mmap();         // create a new, larger, mapping

然后将新数据复制到新内存映射的末尾。 然而,munmap/mmap 是不可取的,因为它意味着下一次每次 访问数据库文件的页面时发生轻微页面​​错误并且 系统必须在操作系统页面缓存中搜索正确的帧 与虚拟内存地址相关联。换句话说,它会减慢 减少后续数据库读取。

在Linux上,我们可以使用非标准的mremap()系统调用来代替 munmap()/mmap() 来调整映射大小。这似乎避免了 轻微页面错误。

问题:在其他系统(例如 OSX)上应该如何处理这个问题? 没有 mremap() 吗?


目前我们有两个想法。还有一个关于每个问题的问题:

1) 创建大于数据库文件的映射。那么,在延伸的时候 数据库文件,只需调用 ftruncate() 即可扩展该文件 磁盘并继续使用相同的映射。

这将是理想的,并且在实践中似乎可行。然而,我们在 担心手册页中的此警告:

“更改底层文件大小的影响 映射到与添加或删除的区域相对应的页面上 该文件未指定。”

问:这是我们应该担心的事情吗?或者是不合时宜的 在此刻?

2)扩展数据库文件时,使用mmap()的第一个参数 请求与数据库的新页面相对应的映射 文件位于虚拟中当前映射之后 记忆。有效地扩展了初始映射。如果系统 无法满足在之后立即放置新映射的请求 首先,回到 munmap/mmap。

在实践中,我们发现 OSX 在定位方面非常出色 以这种方式映射,所以这个技巧在那里起作用。

问题:如果系统立即分配第二个映射 在虚拟内存中的第一个之后,最终是否安全 使用对 munmap() 的一次大调用来取消映射它们?


2 可以工作,但您不必依赖操作系统恰好有可用空间,您可以提前保留地址空间,这样您的固定映射将始终成功。

例如,保留一千兆字节的地址空间。做一个

mmap(NULL, 1U << 30, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);

这将保留 1 GB 的连续地址空间,而无需实际分配任何内存或资源。然后,您可以在该空间上执行未来的映射,它们将会成功。因此,将文件映射到返回空间的开头,然后根据需要使用固定标志映射文件的其他部分。 mmap 将会成功,因为您的地址空间已由您分配和保留。

注意:linux 也有 MAP_NORESERVE 标志,如果您分配 RAM,这是您希望初始映射的行为,但在我的测试中它被忽略,因为 PROT_NONE 足以表明您还不想分配任何资源。

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

如何可移植地扩展使用 mmap() 访问的文件 的相关文章

随机推荐

  • 在 HTTPServlet 请求中编码 UTF-8

    这可能看起来像是一个已经解决的问题 但事实并非如此 因为我已经解决了所有涉及 UTF 8 的问题 但没有一个解决方案对我有帮助 我使用 JSON 简单库向包含 JSON 对象的 java servlet 发送 http 请求 我在Tomca
  • 如何同时针对多种类型专门化方法

    我有这样的代码 template lt class T gt struct Value quite a lot of other functions which I do not want to specialize too void pr
  • LINQ 使用 OR 连接

    我想使用 OR 语句与 LINQ 进行 JOIN 这是我开始的 SQL 查询 SELECT t id FROM Teams t INNER JOIN Games g ON g homeTeamId t id OR g awayTeamId
  • 如何跟踪 WinForms 中任何子控件何时获得或失去焦点?

    我有一个 Windows 窗体自定义控件 其作用类似于面板 因为它可以包含任意数量的子项 子控件的数量和类型是在运行时确定的 因此我需要以通用方式工作 而不知道可能存在或不存在的确切子控件 我想根据面板是否包含焦点来更改面板的背景颜色 因此
  • 在视图导出中获取摘要计数?

    我需要将视图导出到 Excel 我已经在某处找到了一些代码 它在 xpages 中运行得很好 现在用户想要添加总计摘要 我会解释 我有一个包含用户名 项目 ID 和设备 ID 的文档 我需要做的是导出具有特定项目 ID 的所有文档 在导出中
  • 如何在 C# 中更新查询字符串?

    网址中的某处有一个 sortBy 6 如何在单击按钮时将其更新为 sortBy 4 或 sortBy 2 我是否需要编写自定义字符串函数来创建正确的重定向 URL 如果我只需要附加一个查询字符串变量我会这样做 string complete
  • 使用此椭圆曲线点乘法计算的点不在曲线上,此类带来算术异常

    我得到了使用标准投影坐标进行点乘错误的堆栈 我不知道我错过了什么 但相乘的点并不位于曲线上 有时它会输出类似的内容算术异常 整数不可逆 public class ECPointArthimetic EllipticCurve ec priv
  • 在 redhat linux 上安装 docker - 'container-selinux' 和 'selinux-policy' 问题

    我在 EC2 上有 Linux 并尝试安装 Docker 如何解决 container selinux 和 selinux policy 的问题 lsb release d Description Red Hat Enterprise Li
  • 避免 R 中的 for 循环

    我想要一些关于编写更好的 R 代码的建议 我目前在 R 中编写了一个循环 但它存在性能问题 我无法集中精力对其进行矢量化 因为输出数据帧中的每一行都依赖于较早的行 并且它们会迭代地向下流动 因此我编写了一个循环来按顺序读 写行 我的代码示例
  • ruby-method_missing 返回无方法错误

    我正在尝试使用 method missing 将美元转换为不同的货币 class Numeric currency euro gt 2 yen gt 6 def method missing method id args block met
  • 类型错误:performanceMeasurement.startMeasurement 不是函数

    当尝试在 Next 13 中从 azure msal react 登录时 就发生了错误 当我检查错误日志时 它来自核心库 azure msal react 我也尝试过登录弹出窗口 但错误仍然相同 我有代码 在我的auth ts export
  • 使用 urllib2 进行 POST 调用而不是 GET

    关于 urllib2 和 POST 调用有很多东西 但我遇到了一个问题 我正在尝试对服务进行简单的 POST 调用 url http myserver post service data urllib urlencode name joe
  • 编译时错误和无法访问的代码

    好的 考虑下面的代码 private const int THRESHHOLD 2 static void Main string args string hello if THRESHHOLD gt 1 return Console Wr
  • ggplot更改网格以适应每月数据

    我有一个为期 1 年的数据集 名为afs20 其结构如下 datum包含数据点的日期 maand包含数据点的月份 delta包含目标变量 o ggplot afs20 o geom point aes x datum y delta sta
  • 使用 XPath 获取具有默认命名空间(无命名空间前缀)的元素

    在这个 SOAP XML 文件中 我怎样才能获得7关于使用 XPath 查询
  • Mono 编译器 // 终端模拟器问题

    当我尝试编译 csharp 或 fsharp 文件时出现此错误 使用 gnome 终端或 jetbrain rider 时会发生这种情况 它在 tty 或 xterm 和 urxvt 等终端中运行良好 我还能够编译 c c 和 go 代码
  • 提取服务器证书

    我需要帮助获取适当的代码片段来获取服务器证书 有效和无效 由 CA 签名和自签名 任何链接和参考都将受到高度赞赏 我有一个 UNIX 命令 它可以提供我想要的结果 但我想要使用 Java 得到相同的输出 UNIX 中的命令是这样的 echo
  • ItemTemplate 和 ItemContainerStyle 不能一起使用吗?

    我正在尝试将 ItemTemplate 和 ItemContainerStyle 应用于 ItemsControl
  • 更改 UIActionSheet 中项目的文本颜色 - iOS 8

    我一直在使用以下代码来更改我添加的项目的文本颜色UIActionSheet void willPresentActionSheet UIActionSheet actionSheet for UIView subview in action
  • 如何可移植地扩展使用 mmap() 访问的文件

    我们正在尝试改变 SQLite 一个嵌入式数据库系统 使用 mmap 而不是通常的 read 和 write 调用来访问 磁盘上的数据库文件 对整个数据使用单个大映射 文件 假设文件足够小 我们没有问题 在虚拟内存中为此寻找空间 到目前为止