代码之家  ›  专栏  ›  技术社区  ›  user2882307

内存映射驱动器的预定义区域

  •  2
  • user2882307  · 技术社区  · 11 年前

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

    这些大块数据是从硬盘上混合而来的,没有文件系统,只有数据。

    现在,在我开始这场磨难之前,我想知道两件事。

    1. 有没有可能一个接一个地将特定部分映射到内存中,然后依次读取?首先,我有一个硬盘,我想读取10个100mb的数据块,但每个数据块被1gb的数据分隔开。有没有可能一个接一个地对这10个100mb的区块进行内存映射,这样我就可以像一个接另一个一样访问它?

    2. 我可以存储大量数据吗?e、 假设我有一个10tb的磁盘。可以存储整个磁盘吗?我使用64位操作系统。

    我希望有人能澄清!

    1 回复  |  直到 11 年前
        1
  •  1
  •   fuz    11 年前

    在Linux上,可以使用 mmap() 将文件(甚至块设备)映射到内存的系统调用。如果你不知道怎么做 mmap() 工作,请咨询 man page 在继续这个回答之前。

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

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

    根据您的内存配置,应该可以映射整个磁盘。您可能需要为此配置系统的过度提交行为。

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