我使用ConcurrentDictionary<String, String>
存储大量数据(4 500 000个条目),并且我不想使用额外的内存,因此我在一开始就固定了容量。但是字典在达到指定容量之前会自动增长。
我写了一部分代码来显示只有500个项目的问题,我在私有存储桶数组上进行了反思,因为我没有找到提供真实容量的公共属性:
using System;
using System.Collections.Concurrent;
using System.Reflection;
namespace MemoryUsage
{
class Program
{
static void Main(string[] args)
{
CapacityTest();
}
private static void CapacityTest()
{
int capacity = 500;
ConcurrentDictionary<String, String> dict = new ConcurrentDictionary<string, string>(Environment.ProcessorCount, capacity);
Console.WriteLine("{0} buckets", GetBucketCount(dict));
for (int index = 0; index < capacity; index++)
dict.AddOrUpdate(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), (key, value) => value);
Console.WriteLine("{0} buckets", GetBucketCount(dict));
Console.ReadLine();
}
private static int GetBucketCount(ConcurrentDictionary<string, string> dict)
{
object tables = dict.GetType().GetField("m_tables", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(dict); // "_tables" with .NET Core, "m_tables" with .NET Framework
object buckets = tables.GetType().GetField("m_buckets", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(tables); // "_buckets" with .NET Core, "m_buckets" with .NET Framework
return ((Array)buckets).Length;
}
}
}
显示:
500 buckets at the beginning
1003 buckets at the end
我期望500 buckets at the end
。因为我知道开头的项数,您是否知道避免分配额外内存的方法?
答案 0 :(得分:1)
这是初始容量,而不仅仅是容量。所以你不能限制它。
不要重新发明轮子,只需使用MemoryCache。如果内存不足,它将自动删除项目。如果您确实要控制内存,请使用MemoryCache.CacheMemoryLimit。
答案 1 :(得分:0)
这似乎与值的分布有关(用于优化锁定机制或使用的树结构的特征)。我用一组整数(0-7)尝试了您的代码,处理器计数=8。然后只有8个存储桶。
<div id="map"></div>
<script>
map = null;
poly = null;
function initMap() {
var directionsDisplay = new google.maps.DirectionsRenderer;
var directionsService = new google.maps.DirectionsService;
map = new google.maps.Map(document.getElementById('map'), {
zoom: 7,
center: {
lat: -18.92379,
lng: 47.542537
},
disableDefaultUI: true, // disable the default controls
streetViewControl: true, // add back streetView control
zoomControl: true, // add back the zoom control
mapTypeId: google.maps.MapTypeId.ROADMAP
});
directionsDisplay.setMap(map);
poly = new google.maps.Polyline({
strokeColor: '#000000',
strokeOpacity: 1.0,
strokeWeight: 3
});
poly.setMap(map);
}
</script>
<script async defer src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCSJrLcMUVltUHcVjtC8ZotBshfiue8J68&callback=initMap"></script>
但是,将密钥乘以2时,尝试8中的5后有17个存储桶。