内存映射文件对于不断变化的数据有害吗?

时间:2009-04-28 04:05:31

标签: c++ winapi memory memory-management

我有一项服务,负责从网络上收集不断更新的数据流。目的是整个数据集必须随时可用(只读)。这意味着客户端代码可以访问到达最旧的最新数据消息。

目前的计划是在Windows上使用内存映射文件。主要是因为数据集是巨大的,跨越数十个GiB。无法知道哪些部分需要数据,但是当需要时,客户端可能需要随意跳转。

内存映射文件符合要求。但是我已经看到它(写)说它们最适合已定义的数据集,而不是不断变化的数据集。这是真的?上面描述的场景可以在内存映射文件中运行得相当好吗?

或者我最好为所有数据保留一个内存映射文件,最多可达到一些MB的最新数据,这样内存映射文件几乎可以容纳99%的传入数据历史记录,但是我存储的最多最近,在一个单独的内存缓冲区中说100MB。每次此缓冲区变满时,我将其移动到内存映射文件,然后清除它。

5 个答案:

答案 0 :(得分:1)

任何定义且不变的数据集都是最好的! 内存映射文件通常会胜过其他人 - 大多数操作系统都会将访问缓存在RAM中。 而且性能将是可预测的,当你开始交换时,你不会从悬崖上掉下来。

答案 1 :(得分:1)

听起来像数据库符合您的描述。分页是大多数商业开箱即用的东西。

答案 2 :(得分:1)

从您的问题陈述中,我看到以下要求:

  1. 数据必须始终可用
  2. 数据写入一次,我认为它只是追加,永远不会被覆盖。
  3. 数据读取访问模式是随机的,即跳转
  4. 似乎也有隐含延迟要求
  5. 对我来说,选择内存映射文件来解决3)+ 4)。如果您的数据大小适合内存,这可能是一个合理的解决方案。但是,如果您的数据大小太大而无法容纳在内存中,则内存映射文件可能会因频繁的页面错误而导致性能问题。

    你没有描述如何“跳跃”。如果可以构建索引,您可以将数据保存到多个文件中,将索引保存在内存中,使用索引加载数据和服务,还可以缓存最常用的数据。基本思想类似于基于磁盘的哈希。这可能是一种更具可扩展性的解决方案。

答案 3 :(得分:0)

由于您标记了此Win32,我假设您正在使用32位计算机,在这种情况下,您只是没有足够的地址空间来存储映射所有数据集。这意味着当你“跳转”时,你将不得不在文件中创建和销毁映射,这将使你的效率低​​于预期。

实际上,你通常有一个超过1 GB的连续地址空间来将文件映射到一个32位的Windows框中,如果你破坏你的地址空间,你最终可以减少。

话虽如此,如果你的内存(而不是地址空间)受到限制,那么使用内存映射执行此操作确实有一个好处,因为当你将内存映射为只读文件(而不是明确地将其读入内存)时,操作系统将会文件系统缓存中没有第二个副本。

答案 4 :(得分:0)

该文件可以在一个呈现数据的线程中以只读方式映射,并具有后台工作线程,该线程将文件映射为readwrite以进行追加。