Могу ли я создать файл в Windows, который существует только в памяти - и если да, то как? - PullRequest
0 голосов
/ 09 мая 2020

Этот вопрос не дублирует ни один из этих существующих вопросов:

  • Как я могу сохранить объектный файл, который существует только в памяти как файл внутри моей системы хранения? - Этот вопрос не касается Java API File.
  • Временный файл, который существует только в ОЗУ? - это близко к тому, о чем я прошу, за исключением того, что OP не спрашивает, как создавать файлы из памяти для целей совместного использования, передавая их дочерним процессам
  • Я также не спрашиваю о файле Win32 с отображением памяти - поскольку они по сути противоположны тому, что мне нужно: файл с отображением памяти - это файл на диске, который сопоставлен с процессом ' пространство виртуальной памяти - в то время как мне нужен файл, который существует в файловой системе ОС (но не в физической файловой системе диска), например точка монтирования, и данные этого файла отображаются в существующий буфер в памяти.
    • То есть, с отображенными в память файлами, запись / запись в ab yte с определенным адресом буфера и смещением в памяти приведет к изменению байта с тем же смещением от начала файла, но файл физически существует на диске, что мне не нужно.

Для уточнения и предоставления контекста:

  • У меня есть ASP. NET Базовое серверное приложение, которое получает потоки запросов размером от 1 и 10 МБ на регулярной основе. Эта программа будет работать только на Windows / Windows сервере, поэтому использовать Windows -specifi c можно.
  • 75% времени мое приложение просто считывает эти потоки само и вот и все.
  • Но меньшую часть времени ему нужно, чтобы отдельные приложения читали данные, которые оно начинает использовать Process.Start и передавать имя файла в качестве аргумента командной строки.

    • Он передает данные этим отдельным приложениям, сохраняя поток во временный файл на диске и передавая имя файла этого потока.
    • К сожалению, он не может записать содержимое в дочерний процесс stdin, потому что некоторые из этих программ ожидают файл на диске, а не читают из stdin.
  • Кроме того, пока машина, на которой он работает, много оперативной памяти (так что хранить потоки в буфере в памяти - это нормально), у него медленные вращающиеся-ржавые жесткие диски, что является еще одной причиной, чтобы избежать временных файлов на диске.

  • Я бы хотел бы избежать ненужной буферизации и копий - в идеале я хотел бы передать весь запрос размером 1-10 МБ в один буфер в памяти, а затем предоставить этот же буфер другим процессам и использовать тот же буфер как поддержка временного файла.

  • Если бы я был на Linux, я мог бы использовать tmpfs - это не идеально:

    • Чтобы насколько мне известно, существующий процесс не может дать указание ОС взять существующую область своей виртуальной памяти и сопоставить файл в tmpfs с этой областью памяти, вместо этого tmpfs по-прежнему требует, чтобы файл был заполнен записью (т.е. копирование) всех данных в его файловый дескриптор, что противоречит цели создания системы с нулевым копированием.
  • Windows 'встроенная RAM- функциональность диска ограничивается предоставлением основы для реализации RAM-диска через сторонний драйвер устройства - я удивлен, что Microsoft никогда не поставляла Windows со встроенным RAM-диском GUI или API, особенно учитывая их относительная простота .

    • Программа ImDisk представляет собой реализацию RAM-диска с использованием платформы драйверов RAM-диска Microsoft, но, насколько я могу судить, это больше похоже на tmpfs в том смысле, что он может создать файл, который существует только в памяти, он не позволяет поддерживать данные файла буфером, напрямую доступным для запущенного процесса (или буфером совместно используемой памяти).

1 Ответ

1 голос
/ 09 мая 2020

CreateFileMapping с hFile = INVALID_HANDLE_VALUE " создает объект сопоставления файлов указанного размера, который поддерживается системным файлом подкачки вместо файла в файловой системе " .

Из Рэймонда Чена Источник большой путаницы: «поддерживается системным файлом подкачки» :

Другими словами, «поддерживается системным подкачанием» файл »просто означает« обрабатывается как обычная виртуальная память ».

Если память будет освобождена до того, как она будет выгружена, она никогда не будет записана в системный файл подкачки.

...