我有一个简单的LINQ语句,它构建了一个大约80亿个项目的庞大怪物列表。然后循环每个项目并对该项目执行操作。问题是,在完全创建列表之前,foreach甚至不会运行。是否可以使用LINQ并让它为每个项目执行foreach,因为它构建它而不是等待?
我没有在列表中做任何事情,比如排序。只是直接建立列表。
编辑:这可能看起来很奇怪,但我有一些数据库行有几个数值。我知道这些值的一些算术组合产生了我想要的数字,但我不确定是哪一个。因此我创建了以下LINQ:
(
from I1 in Items
from I2 in Items
from I3 in Items
from I4 in Items
select new Item[] { I1, I2, I3, I4 }
).ToList().ForEach(x => CalculateValues(x);
我为1个项目做了上述声明,然后是2个项目,依此类推。我的电脑在3件物品上悬挂了一段时间,约有2800万件物品。
我知道这是效率低下的,但我打算做一个快速的程序来过夜。
答案 0 :(得分:4)
在构建列表时,如果可能的话,您希望使用yield
,这样您就不会有80亿个项目。
e.g。
public IEnumerable<MyItem> ListBuilder()
{
while (stillBuilding)
{
yield return currentItem;
}
}
然后预测结果。
如果你想要并发/多线程的东西,那么它就会更复杂,你应该有一个线程构建项目并将它们提供给一个队列,一个或多个消费者线程将项目从队列中拉出来并执行操作。
答案 1 :(得分:1)
不要调用ToList()
该方法会尝试将整个数据加载到内存中
试试这个,
var q = from I1 in Items
from I2 in Items
from I3 in Items
from I4 in Items
select new Item[] { I1, I2, I3, I4 };
foreach(var x in q)
{
CalculateValues(x);
}
对于您的输入可能仍然很慢,但如果我是正确的话,它会流式传输结果并一次处理一次。