何十億ものオブジェクトを処理する必要があるアプリケーションがあります。各オブジェクトは TRange クラス タイプです。これらの範囲は、特定の条件やその他のオブジェクト プロパティに依存するアルゴリズムのさまざまな部分で作成されます。その結果、100 個のアイテムがある場合、それ以前のオブジェクトをすべて作成しないと、100 番目のオブジェクトを直接作成することはできません。すべての (数十億の) オブジェクトを作成してコレクションに追加すると、システムは Outofmemory エラーをスローします。ここで、主に 2 つの目的で各オブジェクトを反復処理します。
- TRange オブジェクトごとに操作を適用するには (例: 特定のプロパティを出力する)
- 特定のプロパティの累積合計を取得するには (例: 各範囲には重みプロパティがあり、すべての範囲の重みの合計である totalweight を取得したい)。
Outofmemory を発生させずにこれらのオブジェクトの Iterator を効果的に作成するにはどうすればよいですか?
関数ポインターをアルゴリズム関数に渡すことで、最初のケースを処理しました。例:
procedure createRanges(aProc: TRangeProc);//aProc is a pointer to function that takes a //TRange
var range: TRange;
rangerec: TRangeRec;
begin
range:=TRange.Create;
try
while canCreateRange do begin//certain conditions needed to create a range
rangerec := ReturnRangeRec;
range.Update(rangerec);//don't create new, use the same object.
if Assigned(aProc) then aProc(range);
end;
finally
range.Free;
end;
end;
しかし、このアプローチの問題は、新しい機能を追加することです。たとえば、前述の合計重量を取得するには、アルゴリズム関数を複製するか、オプションの出力パラメーターを渡す必要があります。いくつかのアイデアを提案してください。
よろしくお願いし
ます