【发布时间】:2012-03-07 02:13:21
【问题描述】:
我这几天一直在寻找有关使用 GPU 加速 LINQ 查询的可能性的可靠信息。
到目前为止我“调查”过的技术:
- 微软加速器
- Cudafy
- 梵天
简而言之,是否有可能在 GPU 上对对象进行内存过滤?
假设我们有一些对象的列表,我们想要过滤如下内容:
var result = myList.Where(x => x.SomeProperty == SomeValue);
有这方面的指点吗?
提前致谢!
更新
我会尝试更具体地说明我想要实现的目标:)
我们的目标是使用任何能够以绝对最快的方式过滤对象列表(范围从 ~50 000 到 ~2 000 000)的技术。
过滤完成后我对数据执行的操作(sum、min、max 等)是使用内置的 LINQ 方法进行的,并且对于我们的应用程序来说已经足够快了,所以这不是问题。
瓶颈是“简单地”过滤数据。
更新
只是想补充一下,我已经测试了大约 15 个数据库,包括 MySQL(检查可能的集群方法/memcached 解决方案)、H2、HSQLDB、VelocityDB(目前正在进一步调查)、SQLite、MongoDB 等,当它涉及过滤数据的速度(当然,NO-sql 解决方案不像 sql 解决方案那样提供这一点,但你明白了)和/或实际数据的返回。
只是总结一下我/我们需要什么:
能够在不到 100 毫秒的时间内以 200 列和大约 250 000 行的格式对数据进行排序的数据库。
我目前有一个并行化 LINQ 的解决方案,当过滤 AND 处理结果时,它能够(在特定机器上)在每一行上只花费 nano 秒!
因此,我们需要对每一行进行亚nano-秒过滤。
- 为什么似乎只有内存中的 LINQ 才能提供此功能?
- 为什么这是不可能的?
日志文件中的一些数字:
Total tid för 1164 frågor: 2579
这是瑞典语,可以翻译:
Total time for 1164 queries: 2579
在这种情况下的查询是这样的查询:
WHERE SomeProperty = SomeValue
这些查询都是在 225639 行上并行完成的。
因此,225639 行在大约 2.5 秒内在内存中被过滤了 1164 次。
这是 9,5185952917007032597107300413827e-9 秒/行,但是,这也包括数字的实际处理!我们做 Count (not null)、total count、Sum、Min、Max、Avg、Median。因此,我们对这些过滤的行进行了 7 次操作。
因此,我们可以说它实际上比我们尝试过的数据库快 7 倍,因为在这些情况下我们确实不执行任何聚合操作!
因此,总而言之,与内存中的 LINQ 过滤相比,为什么数据库在过滤数据方面如此糟糕?微软真的做得好到无法与之抗衡吗? :)
虽然内存过滤应该更快是有道理的,但我不希望 感觉它更快。我想知道什么更快,如果可能的话为什么。
【问题讨论】:
-
不是我知道的,而是 +1 的想法。我期待答案。
标签: c# linq gpu dynamic-linq