Windows上最快的小型数据存储

时间:2020-03-06 14:45:02  来源:igfitidea点击:

我的应用跟踪约1000个对象的状态。这些对象以不特定的顺序从持久性存储中读取和写入(序列化)。

现在,该应用程序使用注册表来存储每个对象的状态。这很好,因为:

  • 很简单
  • 非常快
  • 可以读取/写入单个对象的状态,而无需读取一些较大的实体(例如从大型XML文件中提取代码段)
  • 有一个不错的编辑器(RegEdit),可以轻松处理单个项目

话虽如此,我想知道是否有更好的方法。 SQLite似乎是一种可能,但是我们没有与注册表相同级别的多重读取器/多重写入器,也没有简单的方法来编辑现有条目。

还有更好的建议吗?一堆平面文件?

解决方案

我们是否需要在每个更改事件上或者仅在内存中保留对象并在关机时进行存储?如果是这样,只需加载它们并最终对其进行序列化,并假设应用运行了很长时间(并且我们不与其他程序共享该状态),那么内存中的应用将是一个赢家。

如果我们具有固定大小的结构,则可以考虑仅使用内存映射文件并从中分配内存?

如果我们所说的"多重读取器/多重写入器"是指让多个线程同时写入存储,则SQLite是线程安全的(我们可以让并发SELECT和并发写入透明地进行)。请参阅[FAQ [1]]和grep以了解"线程安全"

[1]:http://www.sqlite.org/faq.html/常见问题解答

如果我们确实开始尝试使用SQLite,则应该知道"开箱即用"它可能看起来并不像我们想要的那样快,但是通过应用一些已建立的优化技巧,它可以很快变得更快:

SQLite优化

根据数据的大小和可用的RAM的数量,通过将sqlite设置为使用全内存数据库而不是写入磁盘,将会获得最佳性能提升之一。

对于内存数据库,将NULL作为文件名参数传递给sqlite3_open并确保已正确定义TEMP_STORE

另一方面,如果告诉sqlite使用硬盘,则将获得与当前使用RegEdit即时操作程序数据的类似好处。

使用sqlite模拟当前RegEdit技术的方法是使用sqlite命令行工具连接到磁盘数据库。我们可以在主程序运行时(和/或者在中断模式下暂停时)从命令行对sql数据运行UPDATE语句。

如果我们唯一要做的是对单个对象进行序列化/反序列化(没有奇特的查询),请使用btree数据库,例如Berkeley DB。通过键存储和检索数据块的速度非常快(我假设对象具有可以用作键的ID),并且支持多个进程进行访问。

我怀疑这些天有没有理智的人会走这条路,但是我们描述的某些内容可以通过Window的结构化/复合存储来完成。我只提到这一点,因为我们询问的是Windows,这是Windows的/曾经是这样做的官方方法。

这就是将DOC文件放在一起的方式(但不是新的DOCX格式)。从MSDN来看,它看起来确实很复杂,但是我已经使用了它,它并不是Win32中最差的API。

  • 这并不简单
  • 它很快,我想它会比注册表快。
  • 可以读取/写入单个对象的状态,而无需读取一些较大的实体。
  • 没有像样的编辑器,但是有一些真正的基本内容(VC ++ 6.0在Tools(工具)下有" DocFile Viewer"(是的,这就是这样做的意思),我在网上发现了一些东西。
  • 我们得到一个文件而不是注册表项。
  • 我们将获得一些老式的Windows开发人员怪胎。

其他随机想法:
我认为XML是必经之路(尽管存在随机访问问题)。哎呀,INI文件可能会起作用。如果需要,注册表会为我们提供非常好的谷物安全性,当使用文件的声明更好时,人们似乎会忘记这一点。如果我了解我们在做什么,那么嵌入式DB似乎就显得过分了。