我在这项任务中有些迷路。我们的缓存解决方案需要将大型数据字典拆分为多个分区,然后在单独的线程中对其进行操作。
场景是:我们有一个很大的数据池要保存在内存中(40m行),选择的策略是首先拥有一个带有int键的Dictionary。该词典包含由guid键控的16个词典的子集,并包含一个数据类。
数字16是在启动时计算的,表示CPU内核数* 4。
数据类包含一个byte [],基本上是属性及其值的转换集,它是指向元数据字典和校验和的int指针。
然后有一组控制功能,这些功能负责锁定并根据Guid的第一段(8个十六进制数字)除以除法来分配/检索Guid键控数据。该分隔符仅为FFFFFFFF /16。这样,每个键将分配一个对应的分区。
现在,我需要弄清楚如何在单独的线程中并行地对这些词典执行操作(键查找,迭代和写入)?我会使用“任务”包装这些操作吗?还是将这些庞然大物词典整体加载到单独的线程中会更好?
我对如何实现数据收集器有一个粗略的想法,这将是我认为很容易的部分。
此外,使用“字典”是一种好方法吗?它们的大小限制为每个分区300万行,如果一个分区已满,则控制机制将尝试在使用完全相同的机制的另一台服务器上插入。
.NET实际上是实现此解决方案的一种好语言吗?
任何帮助将不胜感激。
答案 0 :(得分:0)
好的,所以我实现了ReaderWriterLockSlim并通过System.Threading.Tasks实现了并发访问。我还设法从存储中排除了任何dataClass对象,现在它只是一个由byte [] s组成的字典。
它能够存储所有4000万行数据,占用的内存不到4GB,并且通过一些精心的SIMD优化操作,可以在20ms之内执行EQUALS,<,>和SUM操作迭代,所以我想这个问题就可以解决了。
而且并发吞吐量还不错。
我只是想发布此信息,以防将来有人遇到类似问题。