我的应用程序会跟踪大约1000个对象的状态。这些对象以无特定顺序从持久存储(序列化)读取和写入。
现在,应用程序使用注册表来存储每个对象的状态。这很好,因为:
很简单
非常快
可以读取/写入单个对象的状态,而无需读取更大的实体(例如从大型XML文件中提取片段)
有一个不错的编辑器(RegEdit)可以轻松操作个别项目
话虽如此,我想知道是否有更好的方法。 SQLite似乎是一种可能性,但是您没有使用注册表获得的同一级别的多读者/多作者,并且没有简单的方法来编辑现有条目。
有什么更好的建议吗?一堆平面文件?
答案 0 :(得分:5)
如果'多读者/多写者'的意思是你保持很多线程同时写入商店,那么SQLite就是线程安全的(你可以让并发的SELECT和并发写操作透明地处理)。请参阅[FAQ [1]]并grep查看'threadsafe'
[1]:http://www.sqlite.org/faq.html/常见问题解答
答案 1 :(得分:3)
如果您开始尝试使用SQLite,您应该知道“开箱即用”它可能看起来不像您想要的那么快,但通过应用一些已建立的优化提示可以快速加快速度:
根据数据的大小和可用的RAM量,通过将sqlite设置为使用全内存数据库而不是写入磁盘,可以获得最佳性能提升之一。
对于内存数据库,将NULL作为文件名参数传递给sqlite3_open
和make sure that TEMP_STORE is defined appropriately
另一方面,如果您告诉sqlite使用硬盘,那么您将获得与当前RegEdit使用类似的好处,以“动态”操作程序的数据。
使用sqlite模拟当前RegEdit技术的方法是使用sqlite命令行工具连接到磁盘数据库。您可以在主程序运行时(和/或在中断模式下暂停时)从命令行对sql数据运行UPDATE语句。
答案 2 :(得分:1)
我怀疑这些日子里任何理智的人都会走这条路,但你描述的一些内容可以用Window Structured/Compound Storage来完成。我只是提到这个,因为你问的是 Windows - 而且这是Windows的官方方式。
这是DOC文件放在一起的方式(但不是新的DOCX格式)。从MSDN看,它看起来真的很复杂,但我已经使用过它,它不是Win32中最差的 API。
其他随意的想法: 我认为XML是可行的方法(尽管存在随机访问问题)。哎呀,INI文件可能有效。如果您需要,注册表会为您提供非常精细的粮食安全 - 当使用文件的声明更好时,人们似乎忘记了这一点。嵌入式数据库似乎有点过分如果我正在理解你在做什么。
答案 3 :(得分:0)
您是否需要在每个更改事件上或仅在内存中保留对象并在关闭时存储?如果是这样,只需加载它们并在最后序列化它们,假设您的应用程序运行了很长时间(并且您没有与其他程序共享该状态),那么在内存中将成为赢家。
如果您有固定大小的结构,那么您可以考虑使用内存映射文件并从中分配内存?
答案 4 :(得分:0)
如果您唯一要做的是序列化/反序列化单个对象(没有花哨的查询),那么请使用btree数据库,例如Berkeley DB。通过密钥存储和检索数据块非常快(我假设您的对象具有一些可用作密钥的ID),并且支持多个进程的访问。