【问题标题】:memory-mapping pre-defined areas of drive内存映射驱动器的预定义区域
【发布时间】:2014-08-11 21:35:02
【问题描述】:

我想使用内存映射 io 读取非常大的数据块。

这些大块数据来自硬盘,没有文件系统,只有数据。

在我开始这整个考验之前,我想知道两件事。

  1. 是否可以将特定部分的内存映射到内存中,然后依次读取?首先,我有一个硬盘驱动器,我想读取 10 个 100mb 的块,但每个块由 1gb 的数据分隔。是否可以将这 10 个 100mb 的块一个接一个地进行内存映射,这样我就可以像它们一个接一个一样访问它?

  2. 我可以内存映射大量数据吗?例如,假设我有一个 10tb 的磁盘。是否可以存储整个磁盘?我使用的是 64 位操作系统。

希望有人能澄清一下!

【问题讨论】:

  • 请指定您使用的操作系统,因为内存映射不是 C 编程语言的一部分,而是操作系统的一部分。

标签: c linux memory-mapping


【解决方案1】:

在 Linux 上,您可以使用 mmap() 系统调用将文件(甚至是块设备)映射到内存中。如果您不知道mmap() 的工作原理,请在继续回答此问题之前咨询man page

mmap() 调用允许您为要创建的映射指定基地址。 POSIX 指定操作系统可以将此基地址作为在何处放置映射的提示。在 Linux 上,mmap() 会将映射放置在您请求的地址上,如果它是页边界(即可被 4096 整除)。您可以指定MAP_FIXED 以确保将映射放置在您想要的位置,但内核可能会告诉您这是不可能的。

您可以尝试使用上述方法一个接一个地映射您想要的块,但这显然只有在您的块的大小是页面大小的倍数(即 4096 字节)时才有效。我不建议您这样做,因为它可能会在不同的页面大小/配置上中断。

应该可以映射整个磁盘,具体取决于您的内存配置。您可能需要为此配置系统的过度使用行为。

我建议你试试映射整个磁盘是否有效。

【讨论】:

  • 过度提交应该不是问题,因为在这种情况下,内存将直接提交到硬盘。假设磁盘没有使用 PROT_WRITE 和 MAP_PRIVATE 映射,即。不写时复制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-09
  • 1970-01-01
  • 2014-06-30
  • 2017-10-03
  • 1970-01-01
  • 2012-07-07
相关资源
最近更新 更多