.NET Core中的数据存储并行化

时间:2018-08-30 19:12:07

标签: multithreading caching .net-core data-storage

我在这项任务中有些迷路。我们的缓存解决方案需要将大型数据字典拆分为多个分区,然后在单独的线程中对其进行操作。

场景是:我们有一个很大的数据池要保存在内存中(40m行),选择的策略是首先拥有一个带有int键的Dictionary。该词典包含由guid键控的16个词典的子集,并包含一个数据类。

数字16是在启动时计算的,表示CPU内核数* 4。

数据类包含一个byte [],基本上是属性及其值的转换集,它是指向元数据字典和校验和的int指针。

然后有一组控制功能,这些功能负责锁定并根据Guid的第一段(8个十六进制数字)除以除法来分配/检索Guid键控数据。该分隔符仅为FFFFFFFF /16。这样,每个键将分配一个对应的分区。

现在,我需要弄清楚如何在单独的线程中并行地对这些词典执行操作(键查找,迭代和写入)?我会使用“任务”包装这些操作吗?还是将这些庞然大物词典整体加载到单独的线程中会更好?

我对如何实现数据收集器有一个粗略的想法,这将是我认为很容易的部分。

此外,使用“字典”是一种好方法吗?它们的大小限制为每个分区300万行,如果一个分区已满,则控制机制将尝试在使用完全相同的机制的另一台服务器上插入。

.NET实际上是实现此解决方案的一种好语言吗?

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

好的,所以我实现了ReaderWriterLockSlim并通过System.Threading.Tasks实现了并发访问。我还设法从存储中排除了任何dataClass对象,现在它只是一个由byte [] s组成的字典。

它能够存储所有4000万行数据,占用的内存不到4GB,并且通过一些精心的SIMD优化操作,可以在20ms之内执行EQUALS,<,>和SUM操作迭代,所以我想这个问题就可以解决了。

而且并发吞吐量还不错。

我只是想发布此信息,以防将来有人遇到类似问题。