WCF数据服务中的OutOfMemoryException

时间:2011-02-21 16:54:08

标签: .net memory-management wcf-data-services

我试图通过WCF数据服务公开一些实体。我的表包含大量数据,查询可以轻松返回50,000条记录。我有一个excel加载项,它连接到这个服务,并帮助用户将服务中的数据导入他们的Excel工作表。

我的客户端代码是这样的:

UTF8Encoding utf8Encoding = new UTF8Encoding();
Entities plDataEntities = new Entities(new Uri(@"http://localhost/AdoNetDataService.svc/"));

int recordCount = 0;
var apples = (from a mada in plDataEntities.Apples select a).Take(50 * 1000);
using (var fileStream = new FileStream(@"C:\Apples.txt", FileMode.Create))
{
   foreach (Apple apple in apples)
   {
      var description = getAppleDescription(apples);

      byte[] bytes = utf8Encoding.GetBytes(description);

      fileStream.Write(bytes, 0, bytes.Length);
      fileStream.Flush();
      recordCount++;
   }
}

我认为服务将提供这些数据,因为它从Db读取它,但看起来正在进行一些缓冲,我得到一个内存异常。

我没有任何特定的内存管理配置,我找不到任何有关ado.net数据服务内存优化的帮助。任何有关如何优化内存的帮助将不胜感激。此外,我愿意建议遵循不同的路径,以便随时提出建议。

1 个答案:

答案 0 :(得分:0)

您可以进行客户端或服务器端分页以解决此问题:

1>您可以进行客户端分页 - 而不是Take(50 * 1000),您可以将其更改为Take(1000)或其他内容并编写循环,直到加载所有实体。这样你就可以获得更小的块,但另一方面是你正在向服务器进行更多的往返。

2 - ;您可以执行服务器端分页 - 在这种情况下,服务器将为您提供一组实体,并使用下一个链接uri来获取下一组实体。继续查询,直到没有指定下一个链接,此时,您已经下载了客户端中的所有实体。

希望这会有所帮助。 谢谢 PRATIK