我试图通过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数据服务内存优化的帮助。任何有关如何优化内存的帮助将不胜感激。此外,我愿意建议遵循不同的路径,以便随时提出建议。
答案 0 :(得分:0)
您可以进行客户端或服务器端分页以解决此问题:
1>您可以进行客户端分页 - 而不是Take(50 * 1000),您可以将其更改为Take(1000)或其他内容并编写循环,直到加载所有实体。这样你就可以获得更小的块,但另一方面是你正在向服务器进行更多的往返。
2 - ;您可以执行服务器端分页 - 在这种情况下,服务器将为您提供一组实体,并使用下一个链接uri来获取下一组实体。继续查询,直到没有指定下一个链接,此时,您已经下载了客户端中的所有实体。
希望这会有所帮助。 谢谢 PRATIK