我在解决这个问题上遇到了困难,非常感谢任何帮助。
我正在处理一个现有项目。我添加了逻辑来计算值的组合,确保我们不会超过某个限制。例如,给定这个数据表的列:
Name|Age|description
代码确保我们没有超过Name、Age的K种组合。我有包含百万对这样数据的数据。但是在某些情况下,程序会崩溃或卡住,虽然我没有看到任何内存问题或CPU问题。
我使用元组(Name,Age)作为键的ConcurrentDictionary实现了此限制,并且我正在使用C#.NET 6 ..
我可以看到尝试向DS添加元素所需的时间变得非常长。
编辑:添加一些代码片段,虽然这是很多内部实现,但我相信这些是理解问题的主要代码部分:
这是负责限制键的组件:
protected override Result Process(Row row)
{
var valueToLimit = GetValueToLimit(row);
var result = _values.TryAdd(valueToLimit);
}
// some logic related to the case of crossing the limit
return Result.Success;
}
protected abstract T GetValueToLimit(Row row);
}
对于我的情况,实现了函数GetValueToLimit:
protected override string[] GetValueToLimit(Row row)
{ // takes the relevant values from an input record, according to the requested columns.
return _columnIndices.Select(x => row.GetValue(x)).ToArray();
}
最后,这是并发HashSet实现的一些部分:
public class BoundedConcurrentHashSet<K> : ConcurrentHashSet<K>
{
..
public override Result TryAdd(K element)
{
if (Dictionary.Count() < _maxCapacity)
{
return base.TryAdd(element);
}
else
{
return Contains(element) ? Result.AlreadyInHash : Result.ExceedsCapacity;
}
}
使用C# ConcurrentDictionary 实现的ConcurrentHashSet:
public class ConcurrentHashSet<K>
{
public ConcurrentHashSet(IEqualityComparer<K> equalityComparer)
{
Dictionary = new ConcurrentDictionary<K, object>(equalityComparer);
}
protected ConcurrentDictionary<K, object> Dictionary { get; }
public int Count => Dictionary.Count;
public IEnumerable<K> Elements => Dictionary.Keys;
public virtual Result TryAdd(K element)
{
return Dictionary.TryAdd(element, null) ? dResult.Added : Result.AlreadyInHash;
}
public bool Contains(K element)
{
return Dictionary.ContainsKey(element);
}
请分享任何可以帮助的想法。
谢谢