我想知道,C#ConcurrentDictionary是否支持多个同时写入?或者做所有的写入序列化?我知道它是为阅读而优化的,但是写什么呢?我可以期待多线程不断写入字典的良好性能吗?并行字典多次写入
Q
并行字典多次写入
1
A
回答
4
与正常的字典一样,写入被分组到“组”中,然后这些存储桶被组合在锁定组中。锁定组的数量被称为字典的“并发级别”。默认情况下并发级别等于Environment.ProcessorCount
结果的4倍,但是您可以用severalof itsconstructors覆盖它。
要确定两个写入操作是否会碰到相同的锁,它使用私有方法GetBucketAndLockNo
来确定哪个哈希存储区以及要使用哪个锁。
//Code generated via ILSpy from .NET 4.0
private void GetBucketAndLockNo(int hashcode, out int bucketNo, out int lockNo, int bucketCount, int lockCount)
{
bucketNo = (hashcode & 0x7FFFFFFF) % bucketCount;
lockNo = bucketNo % lockCount;
}
所以要回答你原来的问题“我可以期待多线程不断写入字典的良好表现吗?”答案真的取决于散列的分布情况如何,以及是否会不断插入落入相同锁定分组的记录。如果没有使用真实世界的数据进行测试并查看它是否足够高性能,则无法找到答案。
另请注意,.NET 4.5中的there where performance improvements made to ConcurrentDictionary因此如果您使用的是.NET 4.0 vs 4.5,则可能会更改您的结果。例如,如果您不指定构造函数中要使用的锁的数量,它将随着字典的增长而动态添加更多的锁。
相关问题
- 1. 字典写入到多个列(和行)
- 2. 一次写字典?
- 3. Java多次写入写入行?
- 4. Python的,合并多层次的字典
- 5. 结合词典和写入文本文件并再次阅读字典?
- 6. Python将字典写入csv并从csv读取字典
- 7. 将表格划成字典并将每行写入CSV
- 8. NSOuputStream多次写入
- 9. 使用csv从字典中写入多行
- 10. 施加字典多次
- 11. 填补了并行字典多处理
- 12. 将字典写入文件
- 13. 将字典写入plist
- 14. Python将字典写入excel
- 15. Python - 将字典词典写入CSV
- 16. 将值写入表单字段 - 值多次写入
- 17. 重写字典行为Python3
- 18. 为什么HDFS只写入一次并多次读取?
- 19. Python嵌入并运行了多次
- 20. Ada:多次写入文件
- 21. 多次写入元素
- 22. Apache htaccess多次写入
- 23. 庆典合并多行
- 24. 取多行,并将其写入到Excel
- 25. 将字典或字符串写入XML
- 26. 一次写入多次读取内存
- 27. 读取Excel文件,并写入词典
- 28. 并行化字典解析
- 29. 并行化修改字典
- 30. 将多个字符串写入文件并添加新行