У меня есть приложение, которое может обрабатывать миллиарды объектов. Каждый объект имеет тип класса TRange.Эти диапазоны создаются в разных частях алгоритма, который зависит от определенных условий и других свойств объекта.В результате, если у вас есть 100 предметов, вы не можете напрямую создать сотый объект без создания всех предыдущих объектов.Если я создам все (миллиарды) объектов и добавлю в коллекцию, система выдаст ошибку Outofmemory.Теперь я хочу перебрать каждый объект в основном для двух целей:
- Чтобы применить операцию для каждого объекта TRange (например: Вывести определенные свойства)
- Чтобы получить кумулятивную суммуопределенное свойство. (Например: каждый диапазон имеет свойство веса, и я хочу получить общий вес, который является суммой всех весов диапазона).
Как эффективно создать итератор для этих объектов, не поднимаяOutofmemory?
Я обработал первый случай, передав указатель на функцию алгоритма.Например:
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;
Но проблема с этим подходом заключается в том, что для добавления новой функциональности, скажем, для получения общего веса, который я упоминал ранее, нужно либо дублировать функцию алгоритма, либо передать необязательный вывод.параметр.Пожалуйста, предложите несколько идей.
Спасибо всем заранееПрадип