【发布时间】:2020-05-09 03:16:09
【问题描述】:
这个问题不是这些现有问题的重复:
- How can I store an object File that only exists in memory as a file inside of my storage system? - 这个问题与 Java 的
FileAPI 无关。 - Temp file that exists only in RAM? - 这与我的要求很接近,除了 OP 没有询问如何从内存中创建文件以共享将它们传递给子进程李>
-
我也没有询问 Win32 的内存映射文件 - 因为它们本质上与我所追求的相反:内存映射文件是磁盘上的文件,已映射到进程的虚拟内存空间 - 而我想要的是一个存在于操作系统文件系统(但不是磁盘的物理文件系统)中的文件,如挂载点,并且该文件的数据映射到内存中的现有缓冲区。子>
- 即,对于内存映射文件,写入/写入特定缓冲区地址和内存偏移量的字节将导致与文件开头相同偏移量的字节被修改 - 但文件物理上存在于磁盘上,这不是我想要的。
详细说明并提供上下文:
- 我有一个 ASP.NET Core 服务器端应用程序,它定期接收大小在 1 到 10MB 之间的请求流。该程序只能在 Windows / Windows Server 上运行,因此可以使用 Windows 特定的功能。
- 75% 的时间我的应用程序只是自行读取这些流,仅此而已。
-
但在少数情况下,它需要让单独的应用程序读取它使用
Process.Start开始的数据并将文件名作为命令行参数传递。- 它通过将流保存到磁盘上的临时文件并传递该流的文件名,将数据传递给这些单独的应用程序。
- 不幸的是,它无法将内容写入子进程的
stdin,因为其中一些程序需要磁盘上的文件而不是从stdin读取。
1234563避免磁盘上的临时文件。
我想避免不必要的缓冲和复制 - 理想情况下,我想将整个 1-10MB 请求流式传输到单个内存缓冲区中,然后将同一缓冲区公开给其他进程 并且使用相同的缓冲区作为临时文件的支持。
-
如果我在 Linux 上,我可以使用
tmpfs- 它并不完美:- 据我所知,现有进程无法指示操作系统获取其虚拟内存的现有区域并将
tmpfs中的文件映射到该内存区域,而tmpfs仍然需要填充该文件通过将所有数据写入(即复制)其文件描述符 - 这与拥有零拷贝系统的目标背道而驰。
- 据我所知,现有进程无法指示操作系统获取其虚拟内存的现有区域并将
-
Windows 的内置 RAM 磁盘功能仅限于通过第三方设备驱动程序为 RAM 磁盘实现提供基础 - 我很惊讶微软从未在 Windows 中提供内置 RAM 磁盘GUI 或 API,尤其是考虑到它们的相对简单性。
-
The
ImDiskprogram 是使用 Microsoft 的 RAM 磁盘驱动程序平台实现的 RAM 磁盘,但据我所知,虽然它更像tmpfs,因为它可以创建仅存在于内存中的文件,但它没有t 允许文件数据由正在运行的进程可直接访问的缓冲区(或共享内存缓冲区)支持。
-
The
【问题讨论】:
-
似乎没有用于此目的的用户应用程序级 API。它可以通过实现驱动程序来完成。您能介意分享使用 RAM 的原因吗?为了更好的读/写速度?
-
@RitaHan-MSFT 我想将 1GB 的数据从一个进程传递给一个新的子进程:但该进程只能接受一个文件名,而不是通过
stdin传递它 - 我会喜欢避免在内存中复制那 1GB。
标签: windows winapi temporary-files memory-mapped-files