У меня есть приложение, которое хранит DataTables в кеше в памяти (AppFabric). Эти DataTables могут быть довольно большими. Когда в нашем приложении (на MVC-сайте) много трафика, использование памяти IIS очень быстро проходит через крышу.Очистка больших объектов из памяти IIS
В идеале мы хотим освободить память, которую эти DataTables потребляют после запроса из кэша.
Код контроллера является то, что вдоль линий
Using (DataTable dt = DataTable)
{
DataTable dt = Cache.GetObject(objectID);
//perform some manipulation on Data table
DataTable dtSmaller = dt.Select("Select top 1...");
dt.Dispose();
}
//return from controller
return dtSmaller;
После того, как этот контроллер ударил много раз процесс W3wp.exe использует массу памяти, пока в конце концов выходит из памяти. Что происходит, так это то, что DataTable поступает из кэша, он запрашивает, чтобы уменьшить размер выходных данных. Затем я располагаю исходный DataTable.
Я искал способ освобождения памяти, потребляемую DataTable без зависимости от IIS сборки мусора
Вы несете ответственность за освобождение памяти, но сборщик мусора. Почему вы не используете базу данных? –
Данные поступают от сторонних облачных веб-сервисов. – keitn
Я до сих пор не понимаю, что потребляет столько памяти. Кажется, что ваш кеш содержит большой 'DataTable'. Но этот размер исправить и не должен быть проблемой. Так много ли меньших таблиц, вызывающих эту проблему памяти? Я не могу поверить, что. Что такое 'dt.Select (" Select top 1 ... ");' на самом деле делать, поскольку это недопустимый синтаксис? Вы можете использовать LINQ: 'dt.AsEnumerable(). Возьмите (10)', который не обязательно должен создавать новый 'DataRow []' всегда. Поэтому не возвращайте 'DataTable', но' IEnumerable '. –