需要不强制执行数据一致性的高性能C#集合
我处于一个大规模并行环境中,有一个大型(大量大型对象)静态集合 我找不到任何不强制数据一致性的集合实现。他们都试图使用内部锁定、版本控制(例如:List)或本地复制(例如:ConcurrentBag)来强制执行它需要不强制执行数据一致性的高性能C#集合,c#,multithreading,.net-core,C#,Multithreading,.net Core,我处于一个大规模并行环境中,有一个大型(大量大型对象)静态集合 我找不到任何不强制数据一致性的集合实现。他们都试图使用内部锁定、版本控制(例如:List)或本地复制(例如:ConcurrentBag)来强制执行它 List工作得很好,但是使用版本化并抛出一个invalidooperation\u EnumFailedVersion ConcurrentBag显示我的代码性能下降。它是GC密集型的,并假设生产者/消费者模式。为了数据一致性的目的,它在包的“快照”(ThreadLocal)上迭代,
工作得很好,但是使用版本化并抛出一个List
invalidooperation\u EnumFailedVersion
显示我的代码性能下降。它是GC密集型的,并假设生产者/消费者模式。为了数据一致性的目的,它在包的“快照”(ThreadLocal)上迭代,但内存有限ConcurrentBag
- 我检查了上述两个集合的
和netframework
源代码netcore
- 任何时候都不要隐式锁定。我自己锁
- 不要抛出任何异常,因为我正在读取的数据可能不一致(非原子操作),我知道,这是正常的
- 不要复制自己
- 需要是可变的
- 需要能够添加/删除元素(可能需要显式锁,对于这种罕见的情况,我可以使用锁)
- 编译时大小未知,最大大小为“直到系统内存耗尽和程序崩溃”。(无阵列)
- 可与foreach和Parallel.foreach一起使用
- 不需要订购
- 可以由多个线程读取,可以由多个线程写入,所有这些都可以同时进行。不管任何可能的数据一致性问题。(不得在内部使用“版本”)
LinkedList
很有希望,但从源代码()来看,它似乎具有与List相同的“版本”一致性保护:
我需要创建自己的实现吗 您仍然可以使用,并使用for
循环枚举它,处理可能发生的任何ArgumentOutOfRangeException
异常:
public static IEnumerable<T> AsInconsistentEnumerable<T>(this List<T> list)
{
for (int i = 0; i < list.Count; i++)
{
T current;
try
{
current = list[i];
}
catch (ArgumentOutOfRangeException)
{
yield break;
}
yield return current;
}
}
关于此集合的大小,通过在App.config中配置该选项,您可以在64位平台上增加20亿个元素()。听起来不错,因为
for
不枚举(afaik),它不会触发版本控制检查。。。大概:)
public static IEnumerable<T> AsInconsistentEnumerable<T>(this List<T> list)
{
for (int i = 0; i < list.Count; i++)
{
T current;
try
{
current = list[i];
}
catch (ArgumentOutOfRangeException)
{
yield break;
}
yield return current;
}
}
foreach (var item in myList.AsInconsistentEnumerable())
{
//...
}