3

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

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

  • 很简单

  • 它非常快

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

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

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

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

4

5 回答 5

5

如果您所说的“多读取器/多写入器”的意思是您保持大量线程同时写入存储,那么 SQLite 是线程安全的(您可以有并发 SELECT 并且透明地处理并发写入)。请参阅 [FAQ [1]] 和 grep 以获取“线程安全”

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

于 2008-09-25T21:19:25.367 回答
3

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

SQLite 优化

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

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

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

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

于 2008-09-25T22:54:50.833 回答
1

我怀疑这些天任何理智的人都会走这条路,但是您描述的一些内容可以使用 Window 的Structured/Compound Storage来完成。我只提到这一点,因为你问的是Windows - 这是/曾经是官方的 Windows 方式来做到这一点。

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

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

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

于 2008-09-26T13:24:11.530 回答
0

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

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

于 2008-09-25T21:16:38.213 回答
0

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

于 2008-09-26T12:41:02.867 回答