如何在没有"Outofmemory"错误的情况下处理数十亿个对象

Pra*_*eep 0 delphi oop ooad design-patterns

我有一个可能需要处理数十亿个对象的应用程序.每个对象都是TRange类的类型.这些范围是在算法的不同部分创建的,这取决于某些条件和其他对象属性.因此,如果您有100个项目,则无法在不创建所有先前对象的情况下直接创建第100个对象.如果我创建所有(数十亿)对象并添加到集合中,系统将抛出Outofmemory错误.现在我想迭代遍历每个对象主要有两个目的:

  1. 为每个TRange对象应用操作(例如:输出某些属性)
  2. 获得某个属性的累积总和.(例如:每个范围都有一个权重属性,我想要检索总权重,即所有范围权重的总和).

如何在不提高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;
Run Code Online (Sandbox Code Playgroud)

但是这种方法的问题在于,要添加一个新功能,比如检索我之前提到的Total权重,要么我必须复制算法函数,要么传递一个可选的out参数.请提出一些想法.

谢谢大家
普拉迪普

Run*_*ner 8

对于如此大量的数据,您只需要在内存中包含一部分数据.其他数据应序列化到硬盘驱动器.我解决了这样一个问题:

  1. 我创建了一个扩展存储,可以在内存或硬盘驱动器上存储自定义记录.此存储具有可以在内存中同时存在的最大记录数.
  2. 然后我从自定义记录类中派生出记录类.这些类知道如何从硬盘驱动器存储和加载自己(我使用流).
  3. 每当您需要新的或已经存在的记录时,您都会向扩展存储区请求此类记录.如果超过最大对象数,则存储会将一些最少使用的记录流回硬盘驱动器.

这样记录是透明的.您总是像访问内存一样访问它们,但它们可能首先从硬盘驱动器加载.它工作得很好.顺便说一句,RAM以非常类似的方式工作,因此它只保存硬盘上所有数据的某个子集.这是你的工作集.

我没有发布任何代码,因为它超出了问题本身的范围,只会混淆.