2012-01-12 7 views
3

ディスクに格納されているキーと値のペアのリストを作成する必要があります。キーは追加または削除でき、値は変更でき、キーは一意です。おそらくすべてが一度にメモリに収まらないかもしれないので、マップの更新をディスクに保存する必要があります。ディスク上のファイルによってバックアップされたキー/値ペアのリスト/マップ

問題は、この問題にどのようにアプローチするのかよく分かりません。私はマルチスレッドの問題に対処する方法を理解していますが、どのデータ構造がディスクにデータを格納するのに適しているのかよくわかりません。私が考えることができるものは、ディスク・ストレージの大規模な上書きを引き起こす可能性があります。一方、リレーショナルデータベースとWindowsレジストリではこの問題が処理されるため、アプローチする方法が必要です。

このようなシナリオで「作成」されたデータ構造はありますか?
私は単純に従来のデータ構造(ツリーやスキップリストなど)を使用し、ディスク容量のチャンクを割り当て、要求に応じてメモリにロードする、ある種の「メモリマネージャ」(ディスクバックアップの「ヒープ」)を作成するだけですか?必要に応じてディスクにアンロードしますか?私はそのような "ディスクベースのヒープ"を書く方法を想像することができますが、そのソリューションは非常に優雅ではありません、特にあなたが画像にマルチスレッドを追加するとき。

アイデア?

答えて

1

シナリオで「作成」されたデータ構造は、またはその変形(B+ treeなど)です。

1

長いと短く:いったんディスクに書き込むと、「データ構造」を扱わなくなります。「シリアライゼーション」と「データベース」を扱っています。

C++ STLとそのデータ構造は実際にこれらの問題に対処していませんが、幸いにもすでに数千ものプログラマによって何千回も処理されています。チャンスはあなたのためにうまくいくものを既に書いていると99.9%です。

あなたの説明に基づいて、sqliteはアプリケーションにとってまともでバランスのとれた選択であるように聞こえます。

+0

まあ、私はsqliteと同様のライブラリ/プロジェクトを知っていますが、私はこのことをゼロから書く必要があります。だから問題はそれをどうやって行うのかです。私は、正しい方向を指し示すだけの人を必要としています。なぜなら、私が今まで考えることができた解決策はそれほどエレガントではないからです。 – SigTerm

+0

あなたがやっていることは*実装が簡単なものではありません。パフォーマンス、並行性、およびメモリより大きいデータセットを持つために、うまく動作し、バグのないようにするには、最初にプロジェクトに費やす予定よりも、データベースをゼロから作成する方が時間がかかることがあります。宿題の助けを借りている場合は、それに応じてタグを付けてください。そうでなければ、実証済みの図書館を利用しない理由があってはいけません。 – sirbrialliance

+0

@SigTermなぜゼロから書くべきなのですか? –

1

より複雑なフィールドベースのクエリではなく、参照のみ(および挿入、削除)が必要な場合は、BDBをアプリケーションに適したものにすることができます。

関連する問題