Delphi 程序内存不足
我创建了一个ObjectDictionary: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
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