我想使用内存映射 io 读取非常大的数据 block 。
这些大块数据来自硬盘,没有文件系统,只有数据。
现在,在我开始整个考验之前,我想知道两件事。
是否可以仅将特定部分内存映射到内存中,然后依次读取?首先,我有一个硬盘驱动器,我想在其中读取 10 个 100mb 的 block ,但每个 block 都由 1gb 的数据分隔。是否可以将这 10 个 100mb 的 block 一个接一个地进行内存映射,这样我就可以像一个接一个地访问它一样访问它?
我可以内存映射大量数据吗?例如,假设我有一个 10tb 的磁盘。是否可以存储整个磁盘?我使用 64 位操作系统。
希望有人能说清楚!
最佳答案
在 Linux 上,您可以使用 mmap()
系统调用将文件(甚至 block 设备)映射到内存中。如果您不知道 mmap()
的工作原理,请参阅 man page在继续这个答案之前。
mmap()
调用允许您为要创建的映射指定基地址。 POSIX 指定操作系统可以将此基地址作为放置映射的提示。在 Linux 上,如果它是页面边界(即可被 4096 整除),则 mmap()
会将映射放置在您请求的地址上。您可以指定 MAP_FIXED
以确保将映射放置在您想要的位置,但内核可能会告诉您这是不可能的。
您可以尝试使用上述方法一个接一个地映射您想要的 block ,但这显然只有在您的 block 的大小是页面大小的倍数(即 4096 字节)时才有效。我不建议您这样做,因为它可能会因不同的页面大小/配置而中断。
根据您的内存配置,应该可以映射整个磁盘。您可能需要为此配置系统的过度使用行为。
如果映射整个磁盘有效,我建议您尝试一下。
关于c - 内存映射预定义的驱动器区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25252815/