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

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

  • 很简单

  • 速度非常快

  • 可以读取/写入单个对象的状态,而无需读取一些较大的实体(例如从大型 XML 文件中提取片段)

  • 有一个不错的编辑器(RegEdit),可以轻松操作单个项目

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

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

有帮助吗?

解决方案

如果您确实开始尝试使用 SQLite,您应该知道“开箱即用”的它可能看起来没有您想要的那么快,但是通过应用一些既定的优化技巧,它可以很快变得更快:

SQLite优化

根据数据大小和可用 RAM 量,通过将 sqlite 设置为使用全内存数据库而不是写入磁盘,将实现最佳性能增益之一。

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

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

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

其他提示

如果“多读取器/多写入器”的意思是让许多线程同时写入存储,那么 SQLite 是线程安全的(您可以并发 SELECT 并透明地处理并发写入)。请参阅 [FAQ [1]] 和 grep 查找“threadsafe”

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

我怀疑现在任何理智的人都会走这条路,但是你所描述的一些内容可以用 Window 来完成 结构化/复合存储. 。我只是在你问的时候才提到这一点 视窗 - 这是/曾经是执行此操作的官方 Windows 方式。

这就是 DOC 文件的组合方式(但不是新的 DOCX 格式)。从MSDN来看,它看起来非常复杂,但我已经使用过它,它不是 最糟糕的 Win32 中的 API。

  • 这是 不是 简单的
  • 速度很快,我会的 猜测 它比注册表更快。
  • 可以读取/写入单个对象的状态,而无需读取某些更大的实体。
  • 没有像样的编辑器,但是有一些真正的基本东西(VC++ 6.0 在工具下有“DocFile Viewer”)。(是的,那东西就是这么做的)我发现了一个 很少 更多的 在线的。
  • 您得到的是一个文件而不是注册表项。
  • 您获得了一些老派 Windows 开发人员的极客信誉。

其他随意的想法:我认为 XML 是可行的方法(尽管存在随机访问问题)。哎呀,INI 文件可能有效。如果您需要的话,注册表可以为您提供非常细粒度的安全性 - 当使用文件的声明更好时,人们似乎会忘记这一点。嵌入式数据库似乎有点矫枉过正 如果 我明白你在做什么。

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

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

如果您唯一要做的就是序列化/反序列化单个对象(没有花哨的查询),那么使用 btree 数据库,例如 伯克利数据库. 。它通过键存储和检索数据块的速度非常快(我假设您的对象有一些可以用作键的 id),并且支持多个进程的访问。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top