内存优化OrderBy和Take?

Jad*_*ias 5 .net c# linq memory out-of-memory

我有9 GB的数据,我只想要10行.当我做:

 data.OrderBy(datum => datum.Column1)
     .Take(10)
     .ToArray();
Run Code Online (Sandbox Code Playgroud)

我得到了OutOfMemoryException.我想使用一种OrderByAndTake方法,针对较低的内存消耗进行了优化.这很容易写,但我想有人已经这样做了.我在哪里可以找到它.

编辑:这是Linq-to-objects.数据来自文件.如果每个行的值Column1小于当前10个最大值的列表,则可以丢弃每一行.

Jim*_*lla 2

我假设您在 Linq to Objects 中执行此操作。你可以做类似的事情...

var best = data
    .Aggregate(new List<T>(), (soFar, current) => soFar
                                                 .Concat(new [] { current })
                                                 .OrderBy(datum => datum.Column1)
                                                 .Take(10)
                                                 .ToList());
Run Code Online (Sandbox Code Playgroud)

这样,并非所有项目都需要保留在新的排序集合中,只需保留您感兴趣的最佳 10 个项目即可。

这是代码最少的方式。由于您知道列表已排序,因此可以优化soFar测试插入位置/是否插入的情况。current我不想为你做所有的工作。;-)

PS:替换T为您的类型。

编辑:想想看,最有效的方法实际上是一个简单的旧方法foreach,将每个项目与最佳 10 个项目的运行列表进行比较。