Fastest small datastore on Windows

2019-05-10 13:27发布

My app keeps track of the state of about 1000 objects. Those objects are read from and written to a persistent store (serialized) in no particular order.

Right now the app uses the registry to store each object's state. This is nice because:

  • It is simple

  • It is very fast

  • Individual object's state can be read/written without needing to read some larger entity (like pulling out a snippet from a large XML file)

  • There is a decent editor (RegEdit) which allow easily manipulating individual items

Having said that, I'm wondering if there is a better way. SQLite seems like a possibility, but you don't have the same level of multiple-reader/multiple-writer that you get with the registry, and no simple way to edit existing entries.

Any better suggestions? A bunch of flat files?

5条回答
Summer. ? 凉城
2楼-- · 2019-05-10 13:44

I doubt any sane person would go this route these days, however some of what you describe could be done with Window's Structured/Compound Storage. I only mention this since you're asking about Windows - and this is/was an official Windows way to do this.

This is how DOC files were put together (but not the new DOCX format). From MSDN it'll appear really complicated, but I've used it, it isn't the worst API in Win32.

  • it is not simple
  • it is fast, I would guess it's faster then the registry.
  • Individual object's state can be read/written without needing to read some larger entity.
  • There is no decent editor, however there are some real basic stuff (VC++ 6.0 had the "DocFile Viewer" under Tools. (yeah, that's what that thing did) I found a few more online.
  • You get a file instead of registry keys.
  • You gain some old-school Windows developer geek-cred.

Other random thoughts: I think XML is the way to go (despite the random access issue). Heck, INI files may work. The registry gives you very fine grain security if you need it - people seem to forget this when the claim using files are better. An embedded DB seems like overkill if I'm understanding what you're doing.

查看更多
叼着烟拽天下
3楼-- · 2019-05-10 13:51

If what you mean by 'multiple-reader/multiple-writer' is that you keep a lot of threads writing to the store concurrently, SQLite is threadsafe (you can have concurrent SELECTs and concurrent writes are handled transparently). See the [FAQ [1]] and grep for 'threadsafe'

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

查看更多
The star\"
4楼-- · 2019-05-10 13:52

Do you need to persist the objects on each change event or just in memory and store on shutdown? If so, just load them up and serialize them at the end, assuming your app runs for a long time (and you don't share that state with another program) then in memory is going to be a winner.

If you've got fixed size structures then you could consider just using a memory mapped file and allocate memory from that?

查看更多
闹够了就滚
5楼-- · 2019-05-10 13:52

If the only thing you do is serialize/deserialize individual objects (no fancy queries), then use a btree database, for example Berkeley DB. It is very fast at storing and retrieving chunks of data by key (I assume your objects have some id that can be used as a key) and access by multiple processes is supported.

查看更多
Emotional °昔
6楼-- · 2019-05-10 13:55

If you do begin to experiment with SQLite, you should know that "out of the box" it might not seem as fast as you would like, but it can quickly be made to be much faster by applying some established optimization tips:

SQLite optimization

Depending on the size of the data and the amount of RAM available, one of the best performance gains will occur by setting sqlite to use an all-in-memory database rather than writing to disk.

For in-memory databases, pass NULL as the filename argument to sqlite3_open and make sure that TEMP_STORE is defined appropriately

On the other hand, if you tell sqlite to use the harddisk, then you will get a similar benefit to your current usage of RegEdit to manipulate the program's data "on the fly."

The way you could simulate your current RegEdit technique with sqlite would be to use the sqlite command-line tool to connect to the on-disk database. You can run UPDATE statements on the sql data from the command-line while your main program is running (and/or while it is paused in break mode).

查看更多
登录 后发表回答