Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 清理IIS内存中的大型对象_C#_Caching_Iis_Memory_Datatable - Fatal编程技术网

C# 清理IIS内存中的大型对象

C# 清理IIS内存中的大型对象,c#,caching,iis,memory,datatable,C#,Caching,Iis,Memory,Datatable,我有一个在内存缓存AppFabric中存储数据表的应用程序。这些数据表可能相当大。一旦我们的应用程序MVC站点出现大量流量,IIS的内存使用就会非常迅速 理想情况下,我们希望能够释放这些数据表在从缓存请求时消耗的内存 控制器的代码是与 Using (DataTable dt = DataTable) { DataTable dt = Cache.GetObject(objectID); //perform some manipulation on Data table

我有一个在内存缓存AppFabric中存储数据表的应用程序。这些数据表可能相当大。一旦我们的应用程序MVC站点出现大量流量,IIS的内存使用就会非常迅速

理想情况下,我们希望能够释放这些数据表在从缓存请求时消耗的内存

控制器的代码是与

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消耗的内存而不依赖IIS垃圾收集的方法

您可以通过调用GC.GetTotalMemorytrue强制执行完整的垃圾收集周期


有关该方法的更多信息:

您不负责释放内存,而是负责释放垃圾收集器。为什么不使用数据库呢?数据来自第三方基于云的web服务。我仍然不明白是什么消耗了这么多内存。您的缓存似乎包含一个大数据表。但这个规模是固定的,不应该成为问题。那么大量较小的表是否会导致内存问题呢?我真不敢相信。什么是dt。选择top 1。。。;实际上是这样做的,因为这不是有效的语法?您可以使用LINQ:dt.AsEnumerable.Take10,它不需要始终创建新的DataRow[]。所以不要返回DataTable,而是IEnumerable。select仅用于演示。基本上,它在数据表上运行查询并返回较小的数据部分。缓存是另一个应用程序MS App Fabric。一旦IIS进程从缓存中读取数据表,它就会创建一个本地副本。对控制器的每个请求似乎都在使用所有可用内存创建越来越多的本地副本。缓存还可以包含许多不同的数据表。我认为通过强制GC和使用WeakReference的混合,我应该能够实现我想要的。