Windowsで最速の小さなデータストア
-
02-07-2019 - |
質問
私のアプリは、約1000個のオブジェクトの状態を追跡します。これらのオブジェクトは、特定の順序で永続ストアから読み書きされません(シリアル化されます)。
今、アプリはレジストリを使用して各オブジェクトの状態を保存します。これは、次の理由により便利です。
-
簡単です
-
非常に高速です
-
個々のオブジェクトの状態は、大きなエンティティ(大きなXMLファイルからスニペットを引き出すなど)を読み取る必要なく読み取り/書き込みが可能です
-
個々のアイテムを簡単に操作できる適切なエディタ(RegEdit)があります
それを言って、もっと良い方法があるかどうか疑問に思っています。 SQLiteは可能性のあるように見えますが、レジストリで取得できるレベルのマルチリーダー/マルチライターはなく、既存のエントリを編集する簡単な方法もありません。
より良い提案はありますか?フラットファイルの束?
解決
SQLiteの実験を開始する場合、「すぐに使える」ことを知っておく必要があります。あなたが望むほど速くはないように見えるかもしれませんが、確立された最適化のヒントを適用することで、はるかに速くすることができます:
データのサイズと利用可能なRAMの量に応じて、ディスクに書き込むのではなく、メモリ内のデータベースを使用するようにsqliteを設定することにより、最高のパフォーマンス向上の1つが発生します。
メモリ内データベースの場合、 sqlite3_open
および TEMP_STOREが適切に定義されていることを確認
一方で、sqliteにハードディスクを使用するように指示すると、RegEditの現在の使用と同様の利点が得られ、プログラムのデータを「オンザフライ」で操作できます。
sqliteを使用して現在のRegEditテクニックをシミュレートする方法は、sqliteコマンドラインツールを使用してオンディスクデータベースに接続することです。メインプログラムの実行中(および/またはブレークモードで一時停止中)に、コマンドラインからSQLデータに対してUPDATEステートメントを実行できます。
他のヒント
「マルチリーダー/マルチライター」が意味することは、多くのスレッドが同時にストアに書き込むことを意味する場合、SQLiteはスレッドセーフです(同時SELECTを行うことができ、同時書き込みは透過的に処理されます)。 [FAQ [1]]および 'threadsafe'のgrepを参照してください
[1]: http://www.sqlite.org/faq.html/よくある質問
最近、正気な人がこのルートに行くとは思わないが、あなたが説明することのいくつかは、Windowの構造化/複合ストレージ。あなたが Windows について尋ねているのでこれに言及するだけです-これはこれを行うための公式のWindowsの方法です。
これは、DOCファイルの作成方法です(新しいDOCX形式ではありません)。 MSDNからは非常に複雑に見えますが、私はそれを使用しましたが、Win32の最悪 APIではありません。
- それは単純ではありません単純です
- 高速です。レジストリよりも高速です推測します。
- 個々のオブジェクトの状態は、大きなエンティティを読み取る必要なく読み取り/書き込みが可能です。
- まともなエディタはありませんが、いくつかの本当の基本的なものがあります(VC ++ 6.0には、[ツール]の下に[DocFile Viewer]がありました(ええ、そういうことです)いくつか オンラインオンライン。
- レジストリキーの代わりにファイルを取得します。
- Windowsの昔ながらの開発者オタク信任を得ます。
その他のランダムな考え: ランダムアクセスの問題にもかかわらず、XMLを使用する方法だと思います。ちなみに、INIファイルは動作するかもしれません。レジストリは、必要な場合に非常にきめ細かいセキュリティを提供します。ファイルを使用するクレームの方が優れている場合、人々はこれを忘れているようです。組み込みDBは、やり過ぎだと思われます if あなたが何をしているのか理解しています。
各変更イベントでオブジェクトを保持する必要がありますか、それともメモリに保存してシャットダウン時に保存する必要がありますか?その場合は、アプリを長時間実行し(その状態を別のプログラムと共有しないと仮定して)、最後にそれらをロードしてシリアル化するだけで、メモリ内が勝者になります。
固定サイズの構造がある場合は、メモリマップファイルの使用を検討し、そこからメモリを割り当てることができますか?
行うのが個々のオブジェクトのシリアライズ/デシリアライズのみである場合(派手なクエリはない)、たとえば Berkeley DB 。キーによってデータのチャンクを保存および取得するのが非常に高速であり(オブジェクトにキーとして使用できるIDがあると仮定しています)、複数のプロセスによるアクセスがサポートされています。