3

私のアプリは、約 1000 個のオブジェクトの状態を追跡しています。これらのオブジェクトは、特定の順序で永続ストア (シリアル化) から読み取られ、永続ストアに書き込まれます。

現在、アプリはレジストリを使用して各オブジェクトの状態を保存しています。これは次の理由で優れています。

  • 簡単です

  • とても速いです

  • 個々のオブジェクトの状態は、より大きなエンティティを読み取る必要なく読み書きできます (大きな XML ファイルからスニペットを引き出すなど)。

  • 個々のアイテムを簡単に操作できる適切なエディター (RegEdit) があります。

そうは言っても、もっと良い方法があるかどうか疑問に思っています。SQLite は可能性のように思えますが、レジストリで得られるのと同じレベルのマルチリーダー/マルチライターはなく、既存のエントリを編集する簡単な方法もありません。

より良い提案はありますか?フラットファイルの束?

4

5 に答える 5

5

「複数のリーダー/複数のライター」とは、多くのスレッドが同時にストアに書き込むことを意味する場合、SQLite はスレッドセーフです (同時 SELECT を持つことができ、同時書き込みは透過的に処理されます)。[よくある質問 [1]] を参照し、'threadsafe' については grep してください。

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

于 2008-09-25T21:19:25.367 に答える
3

SQLiteの実験を開始する場合は、「箱から出して」は思ったほど速くはないように見えるかもしれませんが、確立された最適化のヒントを適用することで、すぐにはるかに速くすることができます。

SQLiteの最適化

データのサイズと使用可能なRAMの量に応じて、ディスクに書き込むのではなく、オールインメモリデータベースを使用するようにsqliteを設定することで、最高のパフォーマンス向上の1つが発生します。

インメモリデータベースの場合、ファイル名引数としてNULLを渡し、TEMP_STOREが適切に定義されていることを確認しsqlite3_openます

一方、sqliteにハードディスクを使用するように指示すると、プログラムのデータを「オンザフライ」で操作するためのRegEditの現在の使用法と同様の利点が得られます。

sqliteを使用して現在のRegEdit手法をシミュレートする方法は、sqliteコマンドラインツールを使用してディスク上のデータベースに接続することです。メインプログラムの実行中(および/またはブレークモードで一時停止中)に、コマンドラインからSQLデータに対してUPDATEステートメントを実行できます。

于 2008-09-25T22:54:50.833 に答える
1

最近、正気の人がこのルートに行くとは思えませんが、あなたが説明することのいくつかは、WindowのStructured/CompoundStorageで実行できます。あなたがWindowsについて質問しているので、私はこれについてのみ言及します-そしてこれはこれを行うための公式のWindowsの方法です。

これは、DOCファイルがまとめられた方法です(ただし、新しいDOCX形式ではありません)。MSDNからは非常に複雑に見えますが、私はそれを使用しました。これはWin32で最悪のAPIではありません。

  • 簡単ではありません
  • それは速いです、私はそれがレジストリより速いと思います。
  • 個々のオブジェクトの状態は、大きなエンティティを読み取る必要なしに読み取り/書き込みが可能です。
  • まともなエディタはありませんが、いくつかの実際の基本的なものがあります(VC ++ 6.0にはツールの下に「DocFileViewer」がありました。(ええ、それはそれがしたことです)私はさらにいくつか オンラインで見つけました。
  • レジストリキーの代わりにファイルを取得します。
  • 昔ながらのWindows開発者のオタク信用を得ることができます。

その他のランダムな考え: XMLが進むべき道だと思います(ランダムアクセスの問題にもかかわらず)。ちなみに、INIファイルは機能する可能性があります。レジストリは、必要に応じて非常にきめ細かいセキュリティを提供します。ファイルを使用したクレームの方が優れている場合、人々はこれを忘れているようです。あなたがしていることを私が理解しているなら、組み込みDBはやり過ぎのように思えます。

于 2008-09-26T13:24:11.530 に答える
0

個々のオブジェクトをシリアル化/逆シリアル化することだけを行う場合 (手の込んだクエリは必要ありません)、たとえばBerkeley DBなどの btree データベースを使用します。キーごとにデータのチャンクを保存および取得するのが非常に高速であり(オブジェクトにはキーとして使用できるIDがあると想定しています)、複数のプロセスによるアクセスがサポートされています。

于 2008-09-26T12:41:02.867 に答える
0

変更イベントごとにオブジェクトを永続化する必要がありますか?それとも、シャットダウン時にメモリとストアだけに永続化する必要がありますか? もしそうなら、それらをロードして最後にシリアル化するだけで、アプリが長時間実行されると仮定すると(そしてその状態を別のプログラムと共有しない)、メモリ内が勝者になります。

固定サイズの構造体がある場合は、メモリ マップされたファイルを使用して、そこからメモリを割り当てることを検討できますか?

于 2008-09-25T21:16:38.213 に答える