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