我有一个可能需要处理数十亿个对象的应用程序。每个对象都是 TRange 类类型。这些范围是在取决于某些条件和其他对象属性的算法的不同部分创建的。因此,如果您有 100 个项目,则无法直接创建第 100 个对象而不创建所有先前的对象。如果我创建所有(数十亿个)对象并添加到集合中,系统将抛出 Outofmemory 错误。现在我想遍历每个对象主要有两个目的:
- 为每个 TRange 对象应用一个操作(例如:输出某些属性)
- 获得某个属性的累积总和。(例如:每个范围都有一个权重属性,我想检索总权重,它是所有范围权重的总和)。
如何在不引发内存不足的情况下有效地为这些对象创建迭代器?
我通过将函数指针传递给算法函数来处理第一种情况。例如:
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;
但是这种方法的问题是,要添加一个新功能,比如检索我之前提到的总重量,我必须复制算法函数或传递一个可选的输出参数。请提出一些想法。
提前谢谢
大家