Delphi 程序内存不足

Delphi 程序内存不足,delphi,generics,delphi-10.2-tokyo,tlist,Delphi,Generics,Delphi 10.2 Tokyo,Tlist,我创建了一个ObjectDictionary: SeismicObjectDictList := TObjectDictionary<integer, TSynt_CatalogList>.Create([doOwnsValues]); SeismicObjectDictList := TObjectDictionary<integer, TSynt_CatalogList>.Create(); if _Synt_CatalogList <> nil

我创建了一个ObjectDictionary:

SeismicObjectDictList := TObjectDictionary<integer, TSynt_CatalogList>.Create([doOwnsValues]);
SeismicObjectDictList := TObjectDictionary<integer, TSynt_CatalogList>.Create();
   if _Synt_CatalogList <> nil then
   begin
     for j := 0 to Synt_CatalogList.Count-1 do       
       TObject(Synt_CatalogList[j]).Free;
     FreeAndNil(Synt_CatalogList);
   end;
   FreeAndNil(SeismicObjectDictList);
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Math,
  System.generics.defaults, System.Generics.Collections, Types;

type
  TSynt_Catalog = class
    private
      FCatalog_id: integer;
      FCoordType_id: integer;
      FMining_Region: boolean;
      FYear: integer;
      FBuilding_Class_id: integer;
      FCatalog_Latitude: double;
      FCatalog_Longitude: double;
      FEpicentral_distance: double;
      FMw: double;
    public
      constructor Create(const aCatalog_id, aCoordType_id, aYear, aBuilding_Class_id: integer; const aMining_Region: boolean; const aCatalog_Latitude, aCatalog_Longitude, aEpicentral_distance, aMw: double);
      property Catalog_id: integer read FCatalog_id write FCatalog_id;
      property CoordType_id: integer read FCoordType_id write FCoordType_id;
      property Mining_Region: boolean read FMining_Region write FMining_Region;
      property Year: integer read FYear write FYear;
      property Building_Class_id: integer read FBuilding_Class_id write FBuilding_Class_id;
      property Catalog_Latitude: double read FCatalog_Latitude write FCatalog_Latitude;
      property Catalog_Longitude: double read FCatalog_Longitude write FCatalog_Longitude;
      property Epicentral_distance: double read FEpicentral_distance write FEpicentral_distance;
      property Mw: double read FMw write FMw;
  end;
type
  TSynt_CatalogList = TList<TSynt_Catalog>;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    btnRun: TButton;
    procedure btnRunClick(Sender: TObject);
  private
    { Private declarations }
    Catalog_id, CoordType_id, Catalog_Year, Building_Class_id, Building_id: integer;

    Mining_region: boolean;

    Catalog_Latitude, Catalog_Longitude, Distance, Epicentral_distance, Mw: double;
    Synt_CatalogList: TSynt_CatalogList;

    procedure ProcessBatch(SeismicObjectDictList: TObjectDictionary<integer, TSynt_CatalogList>);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

constructor TSynt_Catalog.Create(const aCatalog_id, aCoordType_id, aYear, aBuilding_Class_id: Integer; const aMining_Region: Boolean; const aCatalog_Latitude, aCatalog_Longitude, aEpicentral_distance, aMw: Double);
begin
  FCatalog_id := aCatalog_id;
  FCoordType_id := aCoordType_id;
  FYear := aYear;
  FBuilding_Class_id := aBuilding_Class_id;
  FMining_Region := aMining_Region;
  FCatalog_Latitude := aCatalog_Latitude;
  FCatalog_Longitude := aCatalog_Longitude;
  FEpicentral_distance := aEpicentral_distance;
  FMw := aMw;
end;


procedure TForm1.btnRunClick(Sender: TObject);
var
  i, j, iCount, Building_id, Building_Count, Limit_count, Batch_count, Data_count: integer;
  SeismicObjectDictList: TObjectDictionary<integer, TSynt_CatalogList>;
  APair: TPair<integer, TSynt_CatalogList>;
begin
   screen.Cursor := crHourGlass;
   Memo1.clear;

   try
     Limit_count := 100;
     SeismicObjectDictList := TObjectDictionary<integer, TSynt_CatalogList>.Create([doOwnsValues]);

     Building_Count := 22000;

     i := 0;
     Building_id := 1;
     Batch_count := 0;

     repeat
       if SeismicObjectDictList = nil then
         SeismicObjectDictList := TObjectDictionary<integer, TSynt_CatalogList>.Create([doOwnsValues]);

       Data_Count := RandomRange(1, 300000);

       Synt_CatalogList := TSynt_CatalogList.Create;

       for j := 0 to Data_Count do
       begin
         Catalog_id := RandomRange(1, 324981);
         CoordType_id := 3;
         Catalog_Year := RandomRange(1, 50000);
         Building_class_id := RandomRange(1, 12);
         Mining_Region := false;
         Catalog_Latitude  := -1.0 *(RandomRange(24000, 25000)/1000);
         Catalog_Longitude := (RandomRange(24000, 25000)/1000);
         Epicentral_distance := RandomRange(1, 450000);
         Mw := RandomRange(4, 12);

         Synt_CatalogList.Add(TSynt_Catalog.Create(Catalog_id, CoordType_id, Catalog_Year, Building_class_id, Mining_Region, Catalog_Latitude, Catalog_Longitude, Epicentral_distance, Mw));
       end;

       Synt_CatalogList.TrimExcess;
       SeismicObjectDictList.Add(Building_id, Synt_CatalogList);

       Memo1.Lines.Add('Building ' + Batch_count.ToString);
       inc(Batch_count);

       if Batch_count = Limit_count then
       begin
         SeismicObjectDictList.TrimExcess;

         ProcessBatch(SeismicObjectDictList);
         Memo1.Lines.Add('---- Batch of ' + Batch_count.ToString + ' processed ------');

         sleep(1000);
         FreeAndNil(SeismicObjectDictList);
         Batch_count := 0;
       end;

       inc(Building_id);
       inc(i);
     until (i = Building_Count);

   finally
     screen.Cursor := crDefault;
   end;
end;

procedure TForm1.ProcessBatch(SeismicObjectDictList: TObjectDictionary<integer, TSynt_CatalogList>);
var
  i, j, akey, Key: integer;
  APair: TPair<integer, TSynt_CatalogList>;
begin
  for APair in SeismicObjectDictList do
  begin
    aKey := APair.Key;

    for j := 0 to APair.Value.Count-1 do
    begin
      Catalog_id := APair.Value.Items[j].Catalog_id;
      CoordType_id := APair.Value.Items[j].CoordType_id;
      Catalog_Year := APair.Value.Items[j].Year;
      Building_class_id := APair.Value.Items[j].Building_class_id;
      Mining_Region := APair.Value.Items[j].Mining_Region;
      Catalog_Latitude  := APair.Value.Items[j].Catalog_Latitude;
      Catalog_Longitude := APair.Value.Items[j].Catalog_Longitude;
      Epicentral_distance := APair.Value.Items[j].Epicentral_distance;
      Mw := APair.Value.Items[aKey].Mw;
    end;
  end;
end;


end.
不会释放内存,因此程序内存不足

我试过:

SeismicObjectDictList := TObjectDictionary<integer, TSynt_CatalogList>.Create([doOwnsValues]);
SeismicObjectDictList := TObjectDictionary<integer, TSynt_CatalogList>.Create();
   if _Synt_CatalogList <> nil then
   begin
     for j := 0 to Synt_CatalogList.Count-1 do       
       TObject(Synt_CatalogList[j]).Free;
     FreeAndNil(Synt_CatalogList);
   end;
   FreeAndNil(SeismicObjectDictList);
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Math,
  System.generics.defaults, System.Generics.Collections, Types;

type
  TSynt_Catalog = class
    private
      FCatalog_id: integer;
      FCoordType_id: integer;
      FMining_Region: boolean;
      FYear: integer;
      FBuilding_Class_id: integer;
      FCatalog_Latitude: double;
      FCatalog_Longitude: double;
      FEpicentral_distance: double;
      FMw: double;
    public
      constructor Create(const aCatalog_id, aCoordType_id, aYear, aBuilding_Class_id: integer; const aMining_Region: boolean; const aCatalog_Latitude, aCatalog_Longitude, aEpicentral_distance, aMw: double);
      property Catalog_id: integer read FCatalog_id write FCatalog_id;
      property CoordType_id: integer read FCoordType_id write FCoordType_id;
      property Mining_Region: boolean read FMining_Region write FMining_Region;
      property Year: integer read FYear write FYear;
      property Building_Class_id: integer read FBuilding_Class_id write FBuilding_Class_id;
      property Catalog_Latitude: double read FCatalog_Latitude write FCatalog_Latitude;
      property Catalog_Longitude: double read FCatalog_Longitude write FCatalog_Longitude;
      property Epicentral_distance: double read FEpicentral_distance write FEpicentral_distance;
      property Mw: double read FMw write FMw;
  end;
type
  TSynt_CatalogList = TList<TSynt_Catalog>;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    btnRun: TButton;
    procedure btnRunClick(Sender: TObject);
  private
    { Private declarations }
    Catalog_id, CoordType_id, Catalog_Year, Building_Class_id, Building_id: integer;

    Mining_region: boolean;

    Catalog_Latitude, Catalog_Longitude, Distance, Epicentral_distance, Mw: double;
    Synt_CatalogList: TSynt_CatalogList;

    procedure ProcessBatch(SeismicObjectDictList: TObjectDictionary<integer, TSynt_CatalogList>);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

constructor TSynt_Catalog.Create(const aCatalog_id, aCoordType_id, aYear, aBuilding_Class_id: Integer; const aMining_Region: Boolean; const aCatalog_Latitude, aCatalog_Longitude, aEpicentral_distance, aMw: Double);
begin
  FCatalog_id := aCatalog_id;
  FCoordType_id := aCoordType_id;
  FYear := aYear;
  FBuilding_Class_id := aBuilding_Class_id;
  FMining_Region := aMining_Region;
  FCatalog_Latitude := aCatalog_Latitude;
  FCatalog_Longitude := aCatalog_Longitude;
  FEpicentral_distance := aEpicentral_distance;
  FMw := aMw;
end;


procedure TForm1.btnRunClick(Sender: TObject);
var
  i, j, iCount, Building_id, Building_Count, Limit_count, Batch_count, Data_count: integer;
  SeismicObjectDictList: TObjectDictionary<integer, TSynt_CatalogList>;
  APair: TPair<integer, TSynt_CatalogList>;
begin
   screen.Cursor := crHourGlass;
   Memo1.clear;

   try
     Limit_count := 100;
     SeismicObjectDictList := TObjectDictionary<integer, TSynt_CatalogList>.Create([doOwnsValues]);

     Building_Count := 22000;

     i := 0;
     Building_id := 1;
     Batch_count := 0;

     repeat
       if SeismicObjectDictList = nil then
         SeismicObjectDictList := TObjectDictionary<integer, TSynt_CatalogList>.Create([doOwnsValues]);

       Data_Count := RandomRange(1, 300000);

       Synt_CatalogList := TSynt_CatalogList.Create;

       for j := 0 to Data_Count do
       begin
         Catalog_id := RandomRange(1, 324981);
         CoordType_id := 3;
         Catalog_Year := RandomRange(1, 50000);
         Building_class_id := RandomRange(1, 12);
         Mining_Region := false;
         Catalog_Latitude  := -1.0 *(RandomRange(24000, 25000)/1000);
         Catalog_Longitude := (RandomRange(24000, 25000)/1000);
         Epicentral_distance := RandomRange(1, 450000);
         Mw := RandomRange(4, 12);

         Synt_CatalogList.Add(TSynt_Catalog.Create(Catalog_id, CoordType_id, Catalog_Year, Building_class_id, Mining_Region, Catalog_Latitude, Catalog_Longitude, Epicentral_distance, Mw));
       end;

       Synt_CatalogList.TrimExcess;
       SeismicObjectDictList.Add(Building_id, Synt_CatalogList);

       Memo1.Lines.Add('Building ' + Batch_count.ToString);
       inc(Batch_count);

       if Batch_count = Limit_count then
       begin
         SeismicObjectDictList.TrimExcess;

         ProcessBatch(SeismicObjectDictList);
         Memo1.Lines.Add('---- Batch of ' + Batch_count.ToString + ' processed ------');

         sleep(1000);
         FreeAndNil(SeismicObjectDictList);
         Batch_count := 0;
       end;

       inc(Building_id);
       inc(i);
     until (i = Building_Count);

   finally
     screen.Cursor := crDefault;
   end;
end;

procedure TForm1.ProcessBatch(SeismicObjectDictList: TObjectDictionary<integer, TSynt_CatalogList>);
var
  i, j, akey, Key: integer;
  APair: TPair<integer, TSynt_CatalogList>;
begin
  for APair in SeismicObjectDictList do
  begin
    aKey := APair.Key;

    for j := 0 to APair.Value.Count-1 do
    begin
      Catalog_id := APair.Value.Items[j].Catalog_id;
      CoordType_id := APair.Value.Items[j].CoordType_id;
      Catalog_Year := APair.Value.Items[j].Year;
      Building_class_id := APair.Value.Items[j].Building_class_id;
      Mining_Region := APair.Value.Items[j].Mining_Region;
      Catalog_Latitude  := APair.Value.Items[j].Catalog_Latitude;
      Catalog_Longitude := APair.Value.Items[j].Catalog_Longitude;
      Epicentral_distance := APair.Value.Items[j].Epicentral_distance;
      Mw := APair.Value.Items[aKey].Mw;
    end;
  end;
end;


end.
SeismicObjectDictList:=TObjectDictionary.Create();
然后没有成功:

SeismicObjectDictList := TObjectDictionary<integer, TSynt_CatalogList>.Create([doOwnsValues]);
SeismicObjectDictList := TObjectDictionary<integer, TSynt_CatalogList>.Create();
   if _Synt_CatalogList <> nil then
   begin
     for j := 0 to Synt_CatalogList.Count-1 do       
       TObject(Synt_CatalogList[j]).Free;
     FreeAndNil(Synt_CatalogList);
   end;
   FreeAndNil(SeismicObjectDictList);
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Math,
  System.generics.defaults, System.Generics.Collections, Types;

type
  TSynt_Catalog = class
    private
      FCatalog_id: integer;
      FCoordType_id: integer;
      FMining_Region: boolean;
      FYear: integer;
      FBuilding_Class_id: integer;
      FCatalog_Latitude: double;
      FCatalog_Longitude: double;
      FEpicentral_distance: double;
      FMw: double;
    public
      constructor Create(const aCatalog_id, aCoordType_id, aYear, aBuilding_Class_id: integer; const aMining_Region: boolean; const aCatalog_Latitude, aCatalog_Longitude, aEpicentral_distance, aMw: double);
      property Catalog_id: integer read FCatalog_id write FCatalog_id;
      property CoordType_id: integer read FCoordType_id write FCoordType_id;
      property Mining_Region: boolean read FMining_Region write FMining_Region;
      property Year: integer read FYear write FYear;
      property Building_Class_id: integer read FBuilding_Class_id write FBuilding_Class_id;
      property Catalog_Latitude: double read FCatalog_Latitude write FCatalog_Latitude;
      property Catalog_Longitude: double read FCatalog_Longitude write FCatalog_Longitude;
      property Epicentral_distance: double read FEpicentral_distance write FEpicentral_distance;
      property Mw: double read FMw write FMw;
  end;
type
  TSynt_CatalogList = TList<TSynt_Catalog>;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    btnRun: TButton;
    procedure btnRunClick(Sender: TObject);
  private
    { Private declarations }
    Catalog_id, CoordType_id, Catalog_Year, Building_Class_id, Building_id: integer;

    Mining_region: boolean;

    Catalog_Latitude, Catalog_Longitude, Distance, Epicentral_distance, Mw: double;
    Synt_CatalogList: TSynt_CatalogList;

    procedure ProcessBatch(SeismicObjectDictList: TObjectDictionary<integer, TSynt_CatalogList>);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

constructor TSynt_Catalog.Create(const aCatalog_id, aCoordType_id, aYear, aBuilding_Class_id: Integer; const aMining_Region: Boolean; const aCatalog_Latitude, aCatalog_Longitude, aEpicentral_distance, aMw: Double);
begin
  FCatalog_id := aCatalog_id;
  FCoordType_id := aCoordType_id;
  FYear := aYear;
  FBuilding_Class_id := aBuilding_Class_id;
  FMining_Region := aMining_Region;
  FCatalog_Latitude := aCatalog_Latitude;
  FCatalog_Longitude := aCatalog_Longitude;
  FEpicentral_distance := aEpicentral_distance;
  FMw := aMw;
end;


procedure TForm1.btnRunClick(Sender: TObject);
var
  i, j, iCount, Building_id, Building_Count, Limit_count, Batch_count, Data_count: integer;
  SeismicObjectDictList: TObjectDictionary<integer, TSynt_CatalogList>;
  APair: TPair<integer, TSynt_CatalogList>;
begin
   screen.Cursor := crHourGlass;
   Memo1.clear;

   try
     Limit_count := 100;
     SeismicObjectDictList := TObjectDictionary<integer, TSynt_CatalogList>.Create([doOwnsValues]);

     Building_Count := 22000;

     i := 0;
     Building_id := 1;
     Batch_count := 0;

     repeat
       if SeismicObjectDictList = nil then
         SeismicObjectDictList := TObjectDictionary<integer, TSynt_CatalogList>.Create([doOwnsValues]);

       Data_Count := RandomRange(1, 300000);

       Synt_CatalogList := TSynt_CatalogList.Create;

       for j := 0 to Data_Count do
       begin
         Catalog_id := RandomRange(1, 324981);
         CoordType_id := 3;
         Catalog_Year := RandomRange(1, 50000);
         Building_class_id := RandomRange(1, 12);
         Mining_Region := false;
         Catalog_Latitude  := -1.0 *(RandomRange(24000, 25000)/1000);
         Catalog_Longitude := (RandomRange(24000, 25000)/1000);
         Epicentral_distance := RandomRange(1, 450000);
         Mw := RandomRange(4, 12);

         Synt_CatalogList.Add(TSynt_Catalog.Create(Catalog_id, CoordType_id, Catalog_Year, Building_class_id, Mining_Region, Catalog_Latitude, Catalog_Longitude, Epicentral_distance, Mw));
       end;

       Synt_CatalogList.TrimExcess;
       SeismicObjectDictList.Add(Building_id, Synt_CatalogList);

       Memo1.Lines.Add('Building ' + Batch_count.ToString);
       inc(Batch_count);

       if Batch_count = Limit_count then
       begin
         SeismicObjectDictList.TrimExcess;

         ProcessBatch(SeismicObjectDictList);
         Memo1.Lines.Add('---- Batch of ' + Batch_count.ToString + ' processed ------');

         sleep(1000);
         FreeAndNil(SeismicObjectDictList);
         Batch_count := 0;
       end;

       inc(Building_id);
       inc(i);
     until (i = Building_Count);

   finally
     screen.Cursor := crDefault;
   end;
end;

procedure TForm1.ProcessBatch(SeismicObjectDictList: TObjectDictionary<integer, TSynt_CatalogList>);
var
  i, j, akey, Key: integer;
  APair: TPair<integer, TSynt_CatalogList>;
begin
  for APair in SeismicObjectDictList do
  begin
    aKey := APair.Key;

    for j := 0 to APair.Value.Count-1 do
    begin
      Catalog_id := APair.Value.Items[j].Catalog_id;
      CoordType_id := APair.Value.Items[j].CoordType_id;
      Catalog_Year := APair.Value.Items[j].Year;
      Building_class_id := APair.Value.Items[j].Building_class_id;
      Mining_Region := APair.Value.Items[j].Mining_Region;
      Catalog_Latitude  := APair.Value.Items[j].Catalog_Latitude;
      Catalog_Longitude := APair.Value.Items[j].Catalog_Longitude;
      Epicentral_distance := APair.Value.Items[j].Epicentral_distance;
      Mw := APair.Value.Items[aKey].Mw;
    end;
  end;
end;


end.
如果目录列表为零,则
开始
对于j:=0到Synt_CatalogList.Count-1 do
TObject(Synt_CatalogList[j])。免费;
FreeAndNil(Synt_目录列表);
结束;
FreeAndNil(地震活动目录);
现实世界的程序必须(使用新的PPL库)并行处理来自空间数据库(PostgreSQL/PostGIS)的大约150亿条地震记录,因此我必须分批处理,而不会使内存溢出

演示问题的简化程序:

SeismicObjectDictList := TObjectDictionary<integer, TSynt_CatalogList>.Create([doOwnsValues]);
SeismicObjectDictList := TObjectDictionary<integer, TSynt_CatalogList>.Create();
   if _Synt_CatalogList <> nil then
   begin
     for j := 0 to Synt_CatalogList.Count-1 do       
       TObject(Synt_CatalogList[j]).Free;
     FreeAndNil(Synt_CatalogList);
   end;
   FreeAndNil(SeismicObjectDictList);
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Math,
  System.generics.defaults, System.Generics.Collections, Types;

type
  TSynt_Catalog = class
    private
      FCatalog_id: integer;
      FCoordType_id: integer;
      FMining_Region: boolean;
      FYear: integer;
      FBuilding_Class_id: integer;
      FCatalog_Latitude: double;
      FCatalog_Longitude: double;
      FEpicentral_distance: double;
      FMw: double;
    public
      constructor Create(const aCatalog_id, aCoordType_id, aYear, aBuilding_Class_id: integer; const aMining_Region: boolean; const aCatalog_Latitude, aCatalog_Longitude, aEpicentral_distance, aMw: double);
      property Catalog_id: integer read FCatalog_id write FCatalog_id;
      property CoordType_id: integer read FCoordType_id write FCoordType_id;
      property Mining_Region: boolean read FMining_Region write FMining_Region;
      property Year: integer read FYear write FYear;
      property Building_Class_id: integer read FBuilding_Class_id write FBuilding_Class_id;
      property Catalog_Latitude: double read FCatalog_Latitude write FCatalog_Latitude;
      property Catalog_Longitude: double read FCatalog_Longitude write FCatalog_Longitude;
      property Epicentral_distance: double read FEpicentral_distance write FEpicentral_distance;
      property Mw: double read FMw write FMw;
  end;
type
  TSynt_CatalogList = TList<TSynt_Catalog>;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    btnRun: TButton;
    procedure btnRunClick(Sender: TObject);
  private
    { Private declarations }
    Catalog_id, CoordType_id, Catalog_Year, Building_Class_id, Building_id: integer;

    Mining_region: boolean;

    Catalog_Latitude, Catalog_Longitude, Distance, Epicentral_distance, Mw: double;
    Synt_CatalogList: TSynt_CatalogList;

    procedure ProcessBatch(SeismicObjectDictList: TObjectDictionary<integer, TSynt_CatalogList>);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

constructor TSynt_Catalog.Create(const aCatalog_id, aCoordType_id, aYear, aBuilding_Class_id: Integer; const aMining_Region: Boolean; const aCatalog_Latitude, aCatalog_Longitude, aEpicentral_distance, aMw: Double);
begin
  FCatalog_id := aCatalog_id;
  FCoordType_id := aCoordType_id;
  FYear := aYear;
  FBuilding_Class_id := aBuilding_Class_id;
  FMining_Region := aMining_Region;
  FCatalog_Latitude := aCatalog_Latitude;
  FCatalog_Longitude := aCatalog_Longitude;
  FEpicentral_distance := aEpicentral_distance;
  FMw := aMw;
end;


procedure TForm1.btnRunClick(Sender: TObject);
var
  i, j, iCount, Building_id, Building_Count, Limit_count, Batch_count, Data_count: integer;
  SeismicObjectDictList: TObjectDictionary<integer, TSynt_CatalogList>;
  APair: TPair<integer, TSynt_CatalogList>;
begin
   screen.Cursor := crHourGlass;
   Memo1.clear;

   try
     Limit_count := 100;
     SeismicObjectDictList := TObjectDictionary<integer, TSynt_CatalogList>.Create([doOwnsValues]);

     Building_Count := 22000;

     i := 0;
     Building_id := 1;
     Batch_count := 0;

     repeat
       if SeismicObjectDictList = nil then
         SeismicObjectDictList := TObjectDictionary<integer, TSynt_CatalogList>.Create([doOwnsValues]);

       Data_Count := RandomRange(1, 300000);

       Synt_CatalogList := TSynt_CatalogList.Create;

       for j := 0 to Data_Count do
       begin
         Catalog_id := RandomRange(1, 324981);
         CoordType_id := 3;
         Catalog_Year := RandomRange(1, 50000);
         Building_class_id := RandomRange(1, 12);
         Mining_Region := false;
         Catalog_Latitude  := -1.0 *(RandomRange(24000, 25000)/1000);
         Catalog_Longitude := (RandomRange(24000, 25000)/1000);
         Epicentral_distance := RandomRange(1, 450000);
         Mw := RandomRange(4, 12);

         Synt_CatalogList.Add(TSynt_Catalog.Create(Catalog_id, CoordType_id, Catalog_Year, Building_class_id, Mining_Region, Catalog_Latitude, Catalog_Longitude, Epicentral_distance, Mw));
       end;

       Synt_CatalogList.TrimExcess;
       SeismicObjectDictList.Add(Building_id, Synt_CatalogList);

       Memo1.Lines.Add('Building ' + Batch_count.ToString);
       inc(Batch_count);

       if Batch_count = Limit_count then
       begin
         SeismicObjectDictList.TrimExcess;

         ProcessBatch(SeismicObjectDictList);
         Memo1.Lines.Add('---- Batch of ' + Batch_count.ToString + ' processed ------');

         sleep(1000);
         FreeAndNil(SeismicObjectDictList);
         Batch_count := 0;
       end;

       inc(Building_id);
       inc(i);
     until (i = Building_Count);

   finally
     screen.Cursor := crDefault;
   end;
end;

procedure TForm1.ProcessBatch(SeismicObjectDictList: TObjectDictionary<integer, TSynt_CatalogList>);
var
  i, j, akey, Key: integer;
  APair: TPair<integer, TSynt_CatalogList>;
begin
  for APair in SeismicObjectDictList do
  begin
    aKey := APair.Key;

    for j := 0 to APair.Value.Count-1 do
    begin
      Catalog_id := APair.Value.Items[j].Catalog_id;
      CoordType_id := APair.Value.Items[j].CoordType_id;
      Catalog_Year := APair.Value.Items[j].Year;
      Building_class_id := APair.Value.Items[j].Building_class_id;
      Mining_Region := APair.Value.Items[j].Mining_Region;
      Catalog_Latitude  := APair.Value.Items[j].Catalog_Latitude;
      Catalog_Longitude := APair.Value.Items[j].Catalog_Longitude;
      Epicentral_distance := APair.Value.Items[j].Epicentral_distance;
      Mw := APair.Value.Items[aKey].Mw;
    end;
  end;
end;


end.
单元1;
接口
使用
Winapi.Windows、Winapi.Messages、System.SysUtils、System.Variants、System.Classes、Vcl.Graphics、,
Vcl.控件、Vcl.窗体、Vcl.对话框、Vcl.StdCtrls、数学、,
System.generics.defaults、System.generics.Collections、type;
类型
TSynt_Catalog=class
私有的
FCatalog_id:整数;
FCoordType_id:整数;
FMining_区域:布尔;
FYear:整数;
FBuilding_Class_id:整数;
FCatalog_纬度:双倍;
FCatalog_经度:双精度;
FEpicentral_距离:双倍;
FMw:双倍;
公众的
构造函数创建(const aCatalog_id、acordtype_id、aYear、相邻类_id:integer;const aMining_Region:boolean;const aCatalog_纬度、aCatalog_经度、aEpicentral_距离、aMw:double);
属性目录id:整数读取FCatalog\u id写入FCatalog\u id;
属性CoordType\u id:整数读取FCoordType\u id写入FCoordType\u id;
属性挖掘区域:布尔读取区域写入区域;
属性年份:整数读取FYear写入FYear;
属性建筑类id:整数读取建筑类id写入建筑类id;
属性目录纬度:双读FCatalog纬度写FCatalog纬度;
属性目录经度:双读FCatalog经度写FCatalog经度;
属性震中距:双读震中距写震中距;
属性Mw:双读FMw写FMw;
结束;
类型
TSynt_CatalogList=TList;
类型
TForm1=类(TForm)
备忘录1:TMemo;
btnRun:t按钮;
程序btnRunClick(发送方:TObject);
私有的
{私有声明}
目录id、合作类型id、目录年份、建筑类别id、建筑id:整数;
矿区:布尔型;
目录纬度、目录经度、距离、震中距离,Mw:双;
Synt_目录列表:TSynt_目录列表;
程序ProcessBatch(SeismicObjectDictList:TObjectDictionary);
公众的
{公开声明}
结束;
变量
表1:TForm1;
实施
{$R*.dfm}
构造函数TSynt_Catalog.Create(const aCatalog_id,acordtype_id,aYear,aBuilding_Class_id:Integer;const aMining_Region:Boolean;const aCatalog_纬度,aCatalog_经度,aEpicentral_距离,aMw:Double);
开始
FCatalog_id:=aCatalog_id;
FCoordType_id:=aCoordType_id;
FYear:=一年;
F建筑类id:=建筑类id;
成形区:=成形区;
FCatalog_纬度:=aCatalog_纬度;
FCatalog_经度:=aCatalog_经度;
FEpicentral_距离:=aEpicentral_距离;
FMw:=aMw;
结束;
程序TForm1.btnRunClick(发送方:TObject);
变量
i、 j、iCount、Building\u id、Building\u Count、Limit\u Count、Batch\u Count、Data\u Count:整数;
地震活动目录:TObjectDictionary;
APair:TPair;
开始
screen.Cursor:=crHourGlass;
备忘录1.清晰;
尝试
极限计数:=100;
SeismicObjectDictList:=TObjectDictionary.Create([DoownsValue]);
建筑物数量:=22000;
i:=0;
建筑物识别号:=1;
批次计数:=0;
重复
如果地震活动CobjectDictList=nil,则
SeismicObjectDictList:=TObjectDictionary.Create([DoownsValue]);
数据计数:=随机范围(1,300000);
Synt_CatalogList:=TSynt_CatalogList.Create;
对于j:=0到数据计数do
开始
目录id:=随机范围(1324981);
CoordType_id:=3;
目录年:=随机范围(1,50000);
建筑物类别id:=随机范围(1,12);
采矿区:=假;
目录纬度:=-1.0*(随机范围(24000、25000)/1000);
目录经度:=(随机范围(24000、25000)/1000);
震中距:=随机范围(145000);
Mw:=随机范围(4,12);
Synt_CatalogList.Add(TSynt_Catalog.Create(Catalog_id、CoordType_id、Catalog_Year、Building_class_id、Mining_Region、Catalog_纬度、Catalog_经度、震中距离,Mw));
结束;
Synt_CatalogList.trimpress;
添加(建筑物id,Synt目录列表);
备注1.行。添加('Building'+Batch_count.ToString);
inc(批次计数);
如果批次计数=限制计数,则
开始
地震活动目录;
ProcessBatch(地震活动目录);
Memo1.Lines.Add('----Batch of'+Batch_count.ToString+'processed-----');
睡眠(1000);
FreeAndNil(地震活动目录);
批次计数:=0;
结束;
公司(大厦识别号);
公司(一);
直至(i=建筑物数量);
最后
screen.Cursor:=crDefault;
结束;
结束;
过程TForm1.ProcessBatch(SeismicObjectDictList:TObjectDictionary);
变量
i、 j,akey,Key:integer;
APair:TPair;
开始
对于地震活动列表中的APair,请执行以下操作:
开始
aKey:=APair.Key;
对于j:=0到APair.Value.Count-1 do
开始
目录id:=APair.Value.Items[j]。目录id;
CoordType_id:=APair.Value.Items[j].CoordType_id;
目录年:=APair.Value.Items[j].年;
建筑类id:=APair.Value.Items[j]。建筑类id;
挖掘区域:=APair.Value.Items[j].Min