我可以在Windows中创建仅存在于内存中的文件-如果存在,如何?

问题描述 投票:0回答:1

此问题不是这些现有问题的重复:

  • How can I store an object File that only exists in memory as a file inside of my storage system?-这个问题不是关于Java的File API。
  • Temp file that exists only in RAM?-这与我的要求很接近,只不过OP并未询问如何从内存中创建文件以实现共享以将其传递给子进程的目的
  • 我也不询问Win32的内存映射文件-因为它们本质上是我所追求的内容的[[相反:内存映射文件是映射到磁盘的文件在磁盘上进程的虚拟内存空间-而我想要的是OS的文件系统(而不是磁盘的物理文件系统)中存在的文件,例如挂载点,并且该文件的数据映射到内存中的现有缓冲区。
    • 即,对于具有内存映射文件的文件,在特定缓冲区地址处写入/写入字节并在内存中进行偏移将导致与文件开头处相同偏移处的字节被修改-但文件实际存在于-disk,这不是我想要的。
详细说明并提供上下文:

    我有一个ASP.NET Core服务器端应用程序,该应用程序定期接收大小在1到10MB之间的请求流。该程序只能在Windows / Windows Server上运行,因此可以使用Windows特定的功能。
  • 75%的时间,我的应用程序仅自己读取这些流,仅此而已。
  • 但是在少数情况下,它需要一个单独的应用程序读取使用Process.Start开始的数据,并将文件名作为命令行参数传递。

      通过将流保存到磁盘上的临时文件并传递该流的文件名,它将数据传递到这些单独的应用程序。
  • 不幸的是,它无法将内容写入子进程的stdin,因为其中一些程序希望将文件放在磁盘上,而不是从stdin中读取。
  • 另外,当运行的计算机上有很多RAM(因此,将流缓冲在内存中就可以了)时,它具有较慢的

    spinning-rust HDD,这是避免临时文件进入的进一步原因-磁盘。

  • 我想避免不必要的缓冲和复制-理想情况下,我想将整个1-10MB的请求流式传输到单个内存缓冲区中,然后将该相同的缓冲区公开给其他进程

  • 使用与缓冲区相同的缓冲区作为临时文件的备份。
  • [如果我在Linux上,我可以使用tmpfs-这并不完美:

      据我所知,现有进程无法指示操作系统获取其虚拟内存的现有区域并将tmpfs中的文件映射到该内存区域,相反,tmpfs仍要求文件填充为将所有数据写入(即复制)到其文件描述符中,这与建立零复制系统的目的相反。
  • Windows的内置RAM磁盘功能仅限于通过第三方设备驱动程序为实现RAM磁盘提供基础-令我惊讶的是,微软从未向Windows附带内置RAM-磁盘GUI或API,尤其是考虑到它们的相对简单性。

      The ImDisk program是使用Microsoft的RAM磁盘驱动程序平台实现的RAM磁盘,但是据我所知,它更像ImDisk,因为它可以创建仅存在于内存中的文件,不允许通过正在运行的进程直接访问的缓冲区(或共享内存缓冲区)来备份文件的数据。
  • windows winapi temporary-files memory-mapped-files
    1个回答
    0
    投票
    tmpfsCreateFileMapping

    创建指定大小的文件映射对象,该文件映射对象由系统页面文件而不是文件系统中的文件支持“。]]从雷蒙德·陈(Raymond Chen)的CreateFileMapping

    换句话说,“由系统页面文件支持”仅表示“像常规虚拟内存一样处理。”

    如果内存在被调出之前就已释放,那么它将永远不会写入系统页面文件。

    © www.soinside.com 2019 - 2024. All rights reserved.