0

データベース クラスの場合、独自のデータベースを実装していますが、C++ でブロック ストレージを実装する方法に問題があります (各ブロックは 1024 バイトです)。

各データベース テーブルをランダムにアクセス可能なブロックのコレクションとしてハード ディスクに格納します。最初のブロックはメタ データ (ブロック 0) 専用のファイル ヘッダーであり、後続の各ブロックはテーブルの行の格納専用です。 . ブロックはファイルとしてハードディスクに書き込まれます。また、1 つのブロックを「メモリ内」バッファとして使用します。バッファ内のデータを読み取って編集できます。準備ができたら、インメモリ バッファをディスクに書き戻します。

インメモリ バッファの概念化には問題ないと思いますが、メモリ ブロックをファイルに書き込む方法に問題があります。私には 2 つのアイデアがあり、それぞれに独自の困難があります。

アイデア1

正確に 1024 バイトのクラス MemoryBlock を作成します。各 MemoryBlock には、任意のデータ (ファイル ヘッダーまたはテーブルの行) を格納できます。MemoryBlocks の配列をファイルに書き込むことにより、各テーブルを 1 つのファイルとして保存します。

難易度: ファイルの途中で単一のブロックを更新できますか? ファイルを上書きまたは追加する必要があることは、私の理解です。3 つの MemoryBlocks (ブロック 0 ~ 2) のファイルがあり、ブロック 1 にある行を更新したい場合、ブロック 1 をバッファーに取り込んで編集し、その行の途中に書き戻すことができますか?または、ファイル全体をメモリにプルし、必要なものを編集してから、元のファイルを上書きする必要がありますか?

アイデア2

各ブロックを個別のファイルとしてディスクに保存します。これにより、テーブルの残りの部分を気にすることなく、任意のブロックにランダムにアクセスしてディスクに書き戻すことができます

難点:これが本当に 1024 バイトのブロック サイズを強制しているかどうかはわかりません。各ファイルが 1024 バイトを超えないようにする方法はありますか?


私はどちらの考えにも固執していませんが、データベース管理システムのブロック ストレージをよりよく理解するのに役立つ情報があれば感謝しています。


編集: @zaufi が指摘するように、1024 バイトのブロック サイズは非常に特殊です。これを書くとき、私は 4096 バイト ブロックを入力するつもりでした。

4

1 に答える 1

1

ああ、あなたは間違いなくデータベースの内部についてのsmthを読む必要があります...

これが私の5セントです:両方のアイデアは悪いです!なぜ1024バイトのブロックを使用することにしたのですか?最新のHDDの物理セクターサイズは4096バイトです。ディスクコントローラにはキャッシュがあります4M-6M-8M-16M-...したがって、1Kを書き込むことはリソースを浪費するだけです...

ところで、ファイルの途中でsmthを更新することは常に悪い考えです...しかし、パフォーマンスが問題でない場合は、間違いなく行うことができます...

車輪の再発明を行う前に、さまざまなDMBSで使用されている典型的なアプローチを調べてみてください...もう1つの優れた(単純な)情報源:leveldbとfirendsについてのグーグル...-これは間違いなくあなたにアイデアを与えるでしょう!

于 2013-02-19T03:19:44.330 に答える