Самое быстрое маленькое хранилище данных в Windows - PullRequest
3 голосов
/ 26 сентября 2008

Мое приложение отслеживает состояние около 1000 объектов. Эти объекты считываются и записываются в постоянное хранилище (сериализуются) в произвольном порядке.

В настоящее время приложение использует реестр для хранения состояния каждого объекта. Это хорошо, потому что:

  • Это просто

  • Это очень быстро

  • Состояние отдельного объекта может быть прочитано / записано без необходимости чтения какой-либо более крупной сущности (например, извлечения фрагмента из большого файла XML)

  • Есть приличный редактор (RegEdit), который позволяет легко манипулировать отдельными элементами

Сказав это, мне интересно, есть ли лучший способ. SQLite кажется возможным, но у вас нет того же уровня множественного чтения / записи, который вы получаете с реестром, и простого способа редактирования существующих записей.

Есть лучшие предложения? Куча плоских файлов?

Ответы [ 5 ]

5 голосов
/ 26 сентября 2008

Если вы подразумеваете под «несколько читателей / несколько писателей» то, что вы храните множество потоков, одновременно записывающих в хранилище, SQLite является поточно-ориентированным (вы можете иметь одновременные операции SELECT, и одновременные записи обрабатываются прозрачно). См. [FAQ [1]] и grep для «threadsafe»

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

3 голосов
/ 26 сентября 2008

Если вы начнете экспериментировать с SQLite, вы должны знать, что «из коробки» может показаться не так быстро, как хотелось бы, но можно быстро сделать его намного быстрее, применив некоторые устоявшиеся советы по оптимизации:

Оптимизация SQLite

В зависимости от размера данных и объема доступной оперативной памяти один из лучших приростов производительности будет достигнут при настройке sqlite для использования базы данных «все в памяти» вместо записи на диск.

Для баз данных в памяти, передайте NULL в качестве аргумента имени файла в sqlite3_open и убедитесь, что TEMP_STORE определено соответствующим образом

С другой стороны, , если вы скажете sqlite использовать жесткий диск, то вы получите то же преимущество, что и текущее использование RegEdit для манипулирования данными программы «на лету».

Способ, которым вы могли бы смоделировать вашу текущую технику RegEdit с помощью sqlite, заключается в использовании инструмента командной строки sqlite для подключения к базе данных на диске. Вы можете запускать операторы UPDATE для данных sql из командной строки, когда ваша основная программа работает (и / или когда она приостановлена ​​в режиме прерывания).

1 голос
/ 26 сентября 2008

Я сомневаюсь, что любой здравомыслящий человек пойдет по этому пути в наши дни, однако кое-что из того, что вы описываете, может быть сделано с помощью Структурированного / Составного хранилища Window . Я упоминаю об этом только потому, что вы спрашиваете о Windows - и это официальный способ Windows сделать это.

Так DOC-файлы были собраны вместе (но не в новом формате DOCX). С MSDN это будет выглядеть действительно сложно, но я использовал его, это не худший API в Win32.

  • это не просто
  • это быстро, я бы предположил это быстрее, чем реестр.
  • Состояние отдельного объекта может быть прочитано / записано без необходимости чтения какой-либо более крупной сущности.
  • Приличного редактора не существует, однако есть некоторые базовые вещи (в VC ++ 6.0 есть «DocFile Viewer» в разделе «Инструменты». больше онлайн.
  • Вместо ключей реестра вы получаете файл.
  • Вы получаете какого-то старого доброго разработчика Windows для Windows.

Другие случайные мысли: Я думаю, что XML - это путь (несмотря на проблему произвольного доступа). Черт, INI-файлы могут работать. Реестр дает вам очень хорошую защиту зерна, если вам это нужно - люди, кажется, забывают об этом, когда претензии с использованием файлов лучше. Встроенная БД выглядит как излишняя , если Я понимаю, что вы делаете.

0 голосов
/ 26 сентября 2008

Если единственное, что вы делаете, это сериализуете / десериализуете отдельные объекты (без сложных запросов), то используйте базу данных btree, например Berkeley DB . Он очень быстро хранит и извлекает порции данных по ключам (я предполагаю, что у ваших объектов есть некоторый идентификатор, который можно использовать в качестве ключа), и поддерживается доступ несколькими процессами.

0 голосов
/ 26 сентября 2008

Нужно ли сохранять объекты при каждом событии изменения или только в памяти и сохранять при выключении? Если это так, просто загрузите их и сериализуйте в конце, если ваше приложение работает в течение длительного времени (и вы не делите это состояние с другой программой), тогда в памяти будет победитель.

Если у вас есть структуры фиксированного размера, то вы могли бы рассмотреть возможность использования файла с отображенной памятью и выделить из него память?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...