我目前想在我的 c 程序中使用 mmap 来处理非常大的文件。我一直在阅读它是什么,但仍然有一些不确定性我想讨论。我知道它将文件映射到内存,但一次会加载多少文件。如果我为长度参数指定文件的大小,它会加载整个文件吗?如果不是,我可以在 64 位系统上进行 mmap 的最大文件大小是多少。抱歉,如果这是一个微不足道的问题,我已阅读文档,但我想我只是不完全理解它。
非常感谢:)
如果我为长度参数指定文件的大小,它会加载整个文件吗?
最有可能的是,不会。可能不会将单个页面加载到物理内存中。
在我们的rhel linux平台上,没有数据被加载到物理内存中。当我们第一次在 mmap 内存页面中读取一个字时,会发生页面错误,并且该错误由操作系统在后台处理以将该页面加载到物理内存中。为了加载整个文件,我们在每个 mmap 内存页上读取一个单词。
我们在开始对算法计时之前就这样做了。我们不希望操作系统页面错误和内存加载步骤影响基本算法时序。
在 64 位系统上可以 mmap 的最大文件大小是多少?
我们有足够的内存来处理整个文件。 这里一个解决 mmap 限制的链接。
使用 mmap() 映射文件不会将文件复制到物理内存,因此没有理由限制它。只要整个文件能够用虚拟地址空间来表示,就可以进行映射。其工作原理是每个页面并不驻留在内存中,因此访问它会触发页面错误。内核透明地利用这个机会访问文件的该部分。