私はMS Accessファイルからテーブル全体を読みたいので、できるだけ早くそれをやろうとしています。大きなサンプルをテストすると、テーブルの最後のレコードと比較してトップレコードを読み込んだときにループカウンタが高速に増加することがわかりました。ADOTableをスクロールするのがなぜ遅くなり、遅くなるのですか?
procedure TForm1.Button1Click(Sender: TObject);
const
MaxRecords = 40000;
Step = 5000;
var
I, J: Integer;
Table: TADOTable;
T: Cardinal;
Ts: TCardinalDynArray;
begin
Table := TADOTable.Create(nil);
Table.ConnectionString :=
'Provider=Microsoft.ACE.OLEDB.12.0;'+
'Data Source=BigMDB.accdb;'+
'Mode=Read|Share Deny Read|Share Deny Write;'+
'Persist Security Info=False';
Table.TableName := 'Table1';
Table.Open;
J := 0;
SetLength(Ts, MaxRecords div Step);
T := GetTickCount;
for I := 1 to MaxRecords do
begin
Table.Next;
if ((I mod Step) = 0) then
begin
T := GetTickCount - T;
Ts[J] := T;
Inc(J);
T := GetTickCount;
end;
end;
Table.Free;
// Chart1.SeriesList[0].Clear;
// for I := 0 to Length(Ts) - 1 do
// begin
// Chart1.SeriesList[0].Add(Ts[I]/1000, Format(
// 'Records: %s %d-%d %s Duration:%f s',
// [#13, I * Step, (I + 1)*Step, #13, Ts[I]/1000]));
// end;
end;
そして、私のPC上の結果:ここではこれを示すサンプルコードです
テーブルが2つの文字列フィールド、ダブル1と1つの整数があります。主キーも索引フィールドもありません。なぜそれが起こり、どのように私はそれを防ぐことができますか?
いいえ私はコントロールをプログラムで作成していますが、サンプルコードには何も表示されません。 – saastn
Forループが1つだけオフになっていませんか?とにかく、たくさんのレコードを読めば、多くのメモリ割り当てが必要になり、メモリの割り当てが増えるほど時間がかかることに驚いていますか? – MartynA
@MartynAループについては正しいですね。しかし、私はそれがそれを遅くするメモリ割り当てだとは言えません。 'Table.Open'のすべてのレコードをフェッチするように見えますが、タスクマネージャはその行を実行した後にメモリ割り当てを表示しません。 – saastn