我试图找出在Windows中编写文件的最佳方法。为此,我一直在运行一些带有内存映射的测试,试图弄清楚发生了什么以及我应该如何组织事情......
场景:该文件旨在用于多个线程中的单个进程。你应该看到一个线程作为一个工作于文件存储的工作者;其中一些会读,一些会写 - 在某些情况下文件会增长。我希望我的状态能够在进程和操作系统崩溃中幸存下来。文件可能很大,比如:1 TB。
在MSDN上阅读了很多内容之后,我掀起了一个小测试用例。我基本上做的是以下几点:
CreateFile
打开文件(FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH
)。CreateFileMapping
)。MapViewOfFile
)映射内存区域(STORAGE_PROPERTY_QUERY
)。我打算使用的模式是READ + WRITE。到目前为止,我一直无法弄清楚如何正确使用这些构造(diskmon
之类的工具无法正常工作)所以我决定在这里问一下。我基本上想知道的是:我如何才能最好地将这些结构用于我的场景?
如果我理解正确,这或多或少是正确的方法;但是,我不确定CreateFileMapping
vs MapViewOfFile
的确切作用,以及它是否可以在多个线程中工作(例如,在将它们刷新到磁盘时进行写入的方式)。
CreateFileMapping
重新打开它。MapViewOfFile
(似乎限制为2 GB),处理它并再次取消映射。问题:
答案 0 :(得分:-3)
内存映射文件通常最适合READING;不写作您遇到的问题是在进行映射之前必须知道文件的大小。
你说:
在某些情况下文件会增长
这确实排除了内存映射文件。
在Windoze上创建内存映射文件时,您将创建自己的页面文件并将一系列内存映射到该页面文件。这往往是读取二进制数据的最快方法,尤其是在文件是连续的情况下。
对于写入,内存映射文件存在问题。