Linq到具有大型数据集的DataSets / Objects的内存性能

时间:2009-07-20 02:11:01

标签: linq dataset memory-management

简短的问题:有没有人知道Linq的内存性能与大量数据有关?特别是Linq to Datasets或Linq to Objects。

它可以处理的最大记录/对象数是多少?什么是内存开销?任何人都可以发布一些球场内存使用数据吗?

背景

我的公司与外部数据库进行交互(由于过度使用而仍未命名),性能非常差。它有一个适用于基本SELECTS的ODBC接口,但是有一些JOIN的性能从悬崖上掉下来(对于任何试图使用OUTER JOINS的人都有祸了!)。

以前我们通过将带有SELECT * FROM Table语句的数据副本复制到SQL数据库并从SQL运行查询来解决此问题。但是,我们希望从等式中删除SQL服务器(删除外部依赖项)。

我想到的解决方案是将SELECT * FROM Table做成一些DataSet(或可能是自定义对象),并使用Linq在内存中执行所有查询。

我们与之交互的数据大小限制为2GB(我们不需要一次性加载它,最多可能只有几百MB)。但是,我担心看到大量数据的可怕OutOfMemoryException。因此我的问题。

ODBC驱动程序是32位,因此我不能使用64位进程(在两个进程之间没有管道数据,我宁愿将复杂性保持在最低限度)。 ODBC驱动程序是只读的。

关于这一点的其他意见或建议也是受欢迎的(除了使用像SQL Compact这样的嵌入式数据库之外,如果内存查询不可行,那就是我们的计划B。)

PS:我在接下来的几天里做了一些概念基准测试证明(我知道我的案例会有一些具体细节,只有这些基准才能知道),但我希望看到有人已经有过这方面的经验。

编辑:这将使用ClickOnce作为Windows窗体应用程序进行部署。

2 个答案:

答案 0 :(得分:1)

请参阅以下StackOverflow帖子;它包含一些关于如何使用Linq to SQL管理内存的好技巧:

如何使用LINQ-To-SQL避免内存泄漏?
How do I avoid a memory leak with LINQ-To-SQL?

答案 1 :(得分:0)

在不知道您的申请的情况下,只能提供一般性意见。

  1. 如果这是一个Web应用程序,除非您要创建一个内存数据库解决方案,可以跨请求等共享(SQL Server和其他人已经在为您执行此操作),我' d强烈建议不要这样做,因为它不会太可扩展。

  2. 我仍然反对这一点,因为我不认为LINQ中内置了索引机制。使用LINQ执行此操作基本上类似于SQL talk中的TABLE SCAN,您可以遍历整个表以查找正确的数据,而不是使用SQL可以为您提供的更高效的索引。

  3. 是的,使用SQL Server时会产生依赖性和网络传输时间,但我想如果给出正确的查询并返回正确的结果集,SQL仍然会击败你想要做的事情。

  4. 所以,推荐......不要重新发明轮子:)其他人已经为此创建了一个更有效的机制。

    如果您仍想这样做,我强烈建议您对您自己的真实数据进行广泛测试。根据我的经验,如果你的目标是性能,测试w /虚拟数据并不能代表实际数据(大小和内容),那将是永远不够的。