我有下面的代码片段,随着数据的增加需要很长时间才能运行。
OrderEntityColection是List,samplePriceList是List
OrderEntityColection = 30k交易 samplePriceList = 1百万价格
轻松完成10-15分钟或更长时间
我已经用1500个订单和30万个价格测试了这个,但它也需要大约40-50秒,而且订单增加所以价格甚至需要更长时间
你能看到我如何改善这一点。我已经把它从一个大集合中切割成了这些数字。
MarketId = int Audit = string
foreach (var tradeEntity in OrderEntityColection)
{
Parallel.ForEach(samplePriceList,new ParallelOptions {MaxDegreeOfParallelism = 8}, (price) =>
{
if (price.MarketId == tradeEntity.MarketId)
{
if (tradeEntity.InstructionPriceAuditId == price.Audit)
{
// OrderExportColection.Enqueue(tradeEntity);
count++;
}
}
});
}
答案 0 :(得分:0)
在并行循环中,您可以跳过某些项目的处理。这是相当昂贵的,因为你依靠该检查也发生在一个单独的线程上。我只是在处理结果之前先过滤掉结果,如下所示:
foreach (var tradeEntity in OrderEntityColection)
{
Parallel.ForEach(samplePriceList.Where(item=>item.MarketId == tradeEntity.MarketId && item.Audit == tradeEntity.InstructionPriceAuditId) ,new ParallelOptions {MaxDegreeOfParallelism = 8}, (price) =>
{
// Do whatever processing is required here
Interlocked.Increment(ref count);
});
}
在旁注中,您似乎需要将count++
替换为Interlocked.Increment(ref count)
,以确保线程安全。
答案 1 :(得分:0)
在朋友的帮助下进行管理
var samplePriceList = PriceCollection.GroupBy(priceEntity=> priceEntity.MarketId).ToDictionary(g=> g.Key,g=> g.ToList());
foreach (var tradeEntity in OrderEntityColection)
{
var price = samplePriceList[tradeEntity.MarketId].FirstOrDefault(obj => obj.Audit == tradeEntity.Audit);
if (price != null)
{
count+=1;
}
}