从另一个大型列表中筛选数据的大型列表对象:性能降低

Kon*_*tin 6 c# performance

我有两个大的对象列表.首先(大约1 000 000个物体):

public class BaseItem
{
    public BaseItem()
    {

    }

    public double Fee { get; set; } = 0;

    public string Market { get; set; } = string.Empty;

    public string Traider { get; set; } = string.Empty;

    public DateTime DateUtc { get; set; } = new DateTime();
}
Run Code Online (Sandbox Code Playgroud)

第二(约2万件物品):

public class TraiderItem
{
    public TraiderItem()
    {

    }

    public DateTime DateUtc { get; set; } = new DateTime();

    public string Market { get; set; } = string.Empty;

    public string Type { get; set; } = string.Empty;

    public double Price { get; set; } = 0;

    public double Amount { get; set; } = 0;

    public double Total { get; set; } = 0;

    public double Fee { get; set; } = 0;

    public string FeeCoin { get; set; } = string.Empty;
}
Run Code Online (Sandbox Code Playgroud)

当等于等于时,我需要找到Traider项目中的所有项目.现在我使用Any方法:BaseDateUtc Fee

traiderItemsInBase = traiderItems.Where(a => baseItems.Any(x => x.DateUtc == a.DateUtc && Math.Round(x.Fee, 8) == Math.Round((double)a.Fee * 0.4, 8))).ToList();
Run Code Online (Sandbox Code Playgroud)

但这种方式非常慢.有没有办法提高效率?在这种情况下是否有可能使用HashSet

fub*_*ubo 6

首先,我虽然有解决方案Hashet<>Dictionary<>但这并没有真正融入这个用例.如何通过PLINQ使用更多的内核/线程来加快速度AsParallel()

traiderItemsInBase = traiderItems.AsParallel()
    .Where(a => baseItems.Any(x => x.DateUtc == a.DateUtc &&
                              Math.Round(x.Fee, 8) == Math.Round((double)a.Fee * 0.4, 8)))
    .ToList();
Run Code Online (Sandbox Code Playgroud)

这应该可以很好地扩展,因为这些操作发生在您的内存中,而不是查询数据库或其他瓶颈.所以4核应该解决这个问题几乎快4倍.

  • `AsParallel()`:600000 Bases,4000 Traiders - 14 sec; 没有'AsParallel()` - 49秒.现在正尝试使用超线程测试20个核心 (4认同)
  • 20个核心+超线程(40个逻辑处理器) - 2.7秒=) (4认同)