Dai*_*Dai 6 windows winapi temporary-files memory-mapped-files
此问题与以下任何现有问题均不重复:
File。详细说明并提供背景:
但少数情况下,它需要有一个单独的应用程序读取它开始使用的数据,Process.Start并将文件名作为命令行参数传递。
stdin,因为其中一些程序需要磁盘上的文件而不是从stdin.此外,虽然它运行的机器有大量 RAM(因此将流缓冲在内存中很好),但它的HDD旋转速度很慢,生锈,这也是避免在磁盘上保存临时文件的进一步原因。
我想避免不必要的缓冲和复制 - 理想情况下,我想将整个 1-10MB 请求流式传输到单个内存缓冲区中,然后将相同的缓冲区暴露给其他进程,并使用相同的缓冲区作为支持一个临时文件。
如果我在 Linux 上,我可以使用tmpfs- 它并不完美:
tmpfs该内存区域,而是tmpfs仍然需要通过写入(即复制)所有内存来填充该文件。数据到其文件描述符 - 这与零拷贝系统的目标背道而驰。Windows 的内置 RAM 磁盘功能仅限于通过第三方设备驱动程序为 RAM 磁盘实现提供基础 - 令我惊讶的是 Microsoft 从未向 Windows 提供内置 RAM 磁盘 GUI 或 API ,特别是考虑到它们相对简单。
ImDisk程序是使用 Microsoft 的 RAM 磁盘驱动程序平台的 RAM 磁盘的实现,但据我所知,虽然它更像是tmpfs可以创建仅存在于内存中的文件,但它不允许该文件的由正在运行的进程可直接访问的缓冲区(或共享内存缓冲区)支持的数据。CreateFileMappingwith hFile = INVALID_HANDLE_VALUE“创建指定大小的文件映射对象,该对象由系统分页文件而不是文件系统中的文件支持”。
来自 Raymond Chen 的混乱的根源: \xe2\x80\x9c 由系统分页文件 \xe2\x80\x9d 支持:
\n\n\n换句话说,由系统分页文件支持的\xe2\x80\x9c只是意味着\xe2\x80\x9像常规虚拟内存一样处理。\xe2\x80\x9d
\n如果内存在调出之前被释放,那么它将永远不会被写入系统分页文件。
\n