Windows 10注册表作为数据库

时间:2018-07-16 09:45:24

标签: c# database sqlite nosql registry

我想存储大约20万个键值对的数据。

我知道Windows注册表对此不满意,但是随着技术的进步,请耐心等待...

如果我将其存储在注册表中,并且我的应用程序位于App-V类型的容器中(它实际上将位于UWP容器中)-那么注册表对于我的应用程序是本地的。

因此,只有我的应用程序可以访问注册表,它是Windows注册表的一部分(减小了大小),并且我可以直接访问(例如,它没有通过Windows 10的文件访问代理)。

这有问题吗?

  • 性能?与什么相比?
  • 最大尺寸?
  • 多线程访问?
  • 腐败?

我将使用.net 4.7.2和C#。诸如SQLite之类的替代方法意味着在KVP的顶部添加组件并构建数据库。其他想法是esent引擎,但这需要.net包装器。 谢谢

2 个答案:

答案 0 :(得分:1)

具有硬编码字段大小的二进制文件包装程序可以很好地工作,但具有r / w膨胀的缺陷。为此,转到内存映射文件,这些文件非常棒且运行迅速(常规配置可以通过这种方式完成)。

您可以在(Get|Write)PrivateProfile*.函数上使用pinvoke。那古老的东西仍然有效。

总的来说,我看到3个动机:读取,写入和更改检测/通知。 对于前两个,我确认注册表不是用于状态持久性的良好存储(考虑到其上的一般负载)(请使用sysinternals procmon过滤器“路径包含HK”进行检查,并观察谁在敲击(RegRead.*)或纹身注册表(RegWrite.*)。 当然,配置存储还可以,这是注册表的原始设计意图。

监控是另一回事。这样很好,可以让您进行事件驱动的数据存储。

请参阅:pinvoke.net FindFirstChangeNotification。

答案 1 :(得分:0)

@AlexK指出。 Windows注册表虽然是数据库,但未建立索引,因此性能将非常差。这是不使用它的重要原因。

我将调查ESENT和其他基于NoSQL的KVP存储。

感谢所有帖子。