Файлы, сопоставленные с памятью .NET - PullRequest
13 голосов
/ 10 декабря 2008

У меня есть проект, и он требует доступа к большому количеству проприетарных данных в ASP.NET. Это было сделано в Linux / PHP путем загрузки данных в общую память. Мне было интересно, стоит ли пытаться использовать Memory Mapped Files, или есть лучший способ с лучшей поддержкой .NET. Я думал об использовании Data Cache, но не уверен во всех подводных камнях размера данных, сохраняемых в Cache.

Ответы [ 4 ]

30 голосов
/ 27 апреля 2010

Я знаю, что это немного поздно, но платформа .NET 4.0 теперь поддерживает отображаемые в памяти файлы из коробки:

http://blogs.msdn.com/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files-in-net-4.aspx

10 голосов
/ 10 декабря 2008

Если вы ищете библиотеку Memory Mapped для C #, взгляните на filemap Tomas Restrepo wrapper. Он лицензирован по лицензии LGPL.

3 голосов
/ 10 декабря 2008

Файлы с отображением в память можно использовать, когда у вас большой объем данных, и вы не хотите нести расходы на его распределение через границы процесса. Я использовал это для аналогичной цели. Вы должны быть достаточно удобны с небезопасными и закрепленными концепциями памяти в .NET, чтобы использовать преимущества MMF. Очевидно, , блок кэширования Enterprise Library содержит код, который оборачивает базовый API C #. Я видел по крайней мере еще одну реализацию в другом месте.

Если вы можете справиться с затратами на маршалинг, возможно, будет проще и элегантнее использовать какое-то решение .NET для удаленного взаимодействия.

1 голос
/ 10 декабря 2008

Возможно, вы захотите просто выбросить его в объект Cache []. Вы можете установить срок действия кэша на основе реального файла. Тогда всякий раз, когда вы изменяете фактический файл, содержимое для объекта в кеше будет нулевым, и вы можете перезагрузить его. Это может не подходить, если вы имеете дело с большим количеством байтов.

byte[] fileBytes = Cache["fileBytes"];
if (null == fileBytes) {
   // reload the file and add it to the cache.
   string fileLocation = Server.MapPath("path/to/file.txt");
   // Just a same of some bytes.
   fileBytes = new byte[10];
   Cache.Insert(fileLocation, fileBytes, new System.Web.Caching.CacheDependency(fileLocation));
}

Полагаю, у меня нет конкретного ответа о характеристиках кеша и больших объемах данных. http://www.alachisoft.com/ncache/asp-net-cache.html Указывает, что вы получаете от 2 до 3 гигабайт кеш-памяти, которые должны быть разделены между вашим приложением и кешем.

...