Этот вопрос не дублирует ни один из этих существующих вопросов:
- Как я могу сохранить объектный файл, который существует только в памяти как файл внутри моей системы хранения? - Этот вопрос не касается 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
в том смысле, что он может создать файл, который существует только в памяти, он не позволяет поддерживать данные файла буфером, напрямую доступным для запущенного процесса (или буфером совместно используемой памяти).