データベースからの大きな結果セットをメモリに保存したいと考えています。すべてのレコードは可変長であり、アクセス時間は配列と同じくらい高速でなければなりません。これを実装する最良の方法は何ですか? 別のテーブルにオフセットを保持し、すべてのレコードを連続して保存することを考えていましたか? 奇妙ですか?(プログラミング言語: Delphi)
5 に答える
私があなたを完全にフォローしているかどうかはわかりませんが、TList を見てください。
少なくとも Delphi 7 では、ポインタの配列として実装されています。返される結果の数がわかっている場合は、 capacity プロパティを使用して事前にリストを割り当てることができます。
スペースがなくなると、リストは自動的に大きくなります。どれだけ大きくなるかは、リストの大きさによって異なります。
classes ユニットのソースを見て、それが何をしているのかを確認してください。
編集: また、D2009 では genric サポートが TList に追加され、使いやすくなりました。
おそらく最善の方法は、レコードへのポインターの配列を含めることです。その場合、オフセットを処理する必要はなく、ルックアップは一定の時間になります。
mj2008に続いて、レコード配列の代わりに TCLientDataset を使用できます。その結果セットの大きさは?
私は TList を使用し、レコードへのポインターを保存します。
type
pMyRecord : ^TMyRecord;
...
...
...
var
p : pMyRecord;
...
...
New(p);
with p^ do
begin
...
...
end;
...
MyList.Add(P);
データベースの MEMORY バージョンを使用してみませんか? ほとんどの場合、通常は SQL キーワード MEMORY を使用して、完全なテーブルをメモリに保持する方法があります。テーブルをディスクからメモリ テーブルにコピーすると、すべての通常のデータベース操作をメモリ速度で使用できます。これが DBISAM でうまく機能することはわかっています。