2009-07-20 48 views
1

简短问题:有没有人有关于Linq的大容量数据的内存性能的任何信息?特别Linq到数据集或Linq到对象。Linq到大数据集的数据集/对象的内存性能

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

背景

我公司与外部数据库的性能非常差(须因过度crapness仍然未命名)进行交互。它有一个适用于基本SELECTS的ODBC接口,但是有一些JOIN的性能会下降(对于任何试图使用OUTER JOINS的人来说都是有害的)!

此前我们已经通过将SELECT * FROM Table语句复制到SQL数据库并运行SQL查询来解决此问题。但是,我们想从等式中删除SQL服务器(删除外部依赖关系)。

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

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

ODBC驱动程序是32位的,所以我不能使用64位进程(不是没有两个进程之间的管道数据,我宁愿保持复杂性至少)。 ODBC驱动程序是只读的。

有关这方面的其他意见或建议也很受欢迎(除了使用像SQL Compact这样的嵌入式数据库,如果在内存查询中不可行,那是我们的计划B)。 PS:我在接下来几天做了一些概念验证的基准测试(我知道我的情况只会在这些基准测试中有详细说明),但我想看到有人已经有了这方面的经验。

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

回答

0

不知道你的应用程序,只能给一般性评论。

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

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

  3. 是的,当使用SQL Server时,您将确定依赖性和网络传输时间,但我想象给出正确的查询并返回正确的结果集,SQL仍然会击败您正在尝试执行的操作。

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

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

+0

它是WinForms,而不是网页。这就是为什么我们要卸载SQL Server,以尽量减少安装和维护占用空间。 – ligos 2009-07-20 04:24:57

+0

我想你已经在问题中得到了你的答案:)。在这种情况下,我的选择可能会在同一行(Sql CE)。你仍然可以使用LINQ来反对那个组合的内部处理。我不认为强迫LINQ替换真正的DB是一个不错的选择。 – 2009-07-20 04:46:47

+0

我会把它放在船上。我只是试图将一个查询接口包装在一个不好的数据源周围,线性搜索会比我们所拥有的要好得多! – ligos 2009-07-20 05:14:29

1

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

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

+0

写我的问题时没有看到。有帮助,但不是我想要的。 – ligos 2009-07-20 04:21:45