【发布时间】:2021-09-22 20:31:32
【问题描述】:
在 POSIX 系统上,我能够使用 mmap 函数比 getline、getc 等更快地读取文件的内容。这在我正在开发的程序中很重要,因为它预计会读取非常大的文件到记忆;使用 getline 迭代收集行的成本太高。可移植性也是我的软件的要求,所以如果我使用 mmap,我需要找到一种使用 WinApi 来存储映射文件的方法,因为我宁愿不通过 cygwin/msys 编译。通过粗略的搜索,我找到了this MSDN 文章,该文章非常简要地描述了一种将文件映射到内存中的方法,但是,从浏览文档中我无法确定如何实际实现它,我被困在查找示例 sn-ps 代码,例如 POSIX mmap。
如何使用 WinApi 的内存映射选项将文件读入 char*?
【问题讨论】:
-
这是来自 SO 的链接,代码为:stackoverflow.com/questions/22047673/… 它有一个指向 MSDN 文章的链接,但这是另一个 [顶级] 链接:docs.microsoft.com/en-us/windows/win32/memory/file-mapping
-
可能有一个 [thin] 包装库,根据 win32 API 实现
mmap。也许:docs.microsoft.com/en-us/cpp/c-runtime-library/… 我要做的是假设mmap可用的代码。如果找不到mmap包装函数,请自己编写一个,使用上面的win32 API 调用 -
我还没有看到证据表明从内存映射文件中顺序读取比从 C IO 等缓冲流中顺序读取更快(缺少预取等特殊技术)。您很可能没有将苹果与苹果进行比较。
-
@CraigEstey 就像我说的,这不是将苹果与苹果进行比较。第一个 sn-p 使用 CRT 中的字符串例程,而另一个示例在缓冲区中手动解析字符串。给我看一个例子,当第一个
freads 进入 4k 的缓冲区然后解析它 - 与 mmaping 和解析相比 - 然后它将是苹果对苹果。