起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 688|回复: 26

【结】数据导入占用内存-急!!!**

[复制链接]
发表于 2008-3-4 14:03:46 | 显示全部楼层 |阅读模式
做了一个数据导入的功能,代码如下

procedure TMAINFORM.ToolButton9Click(Sender: TObject);
Var
  lExcelToTable:TExcelToTable;
  lMsg,lStr: String;
begin
  BeforeOpenXLS(lStr);
  lMsg := '';
  OpenDialog.Filter := 'Excel(*.xls)|*.xls';
  if OpenDialog.Execute then
  begin
    lExcelToTable:=TExcelToTable.Create(self);
    try
      lExcelToTable.DataSource:=DataSetBrokerTargetValue;
      lExcelToTable.FileName := OpenDialog.FileName;
      lExcelToTable.StartRow := 1;
      lExcelToTable.EndRow := 9999;
      lExcelToTable.FieldMap.Add('DataSetTargetValue.FTARGETNAME=Sheet1[1,0]');
      lExcelToTable.FieldMap.Add('DataSetTargetValue.FTARGETCODE=Sheet1[2,0]');
      lExcelToTable.FieldMap.Add('DataSetTargetValue.FTARGETTYPECODE=Sheet1[3,0]');
      lExcelToTable.FieldMap.Add('DataSetTargetValue.FUNITNAME=Sheet1[4,0]');
      lExcelToTable.FieldMap.Add('DataSetTargetValue.SUBSTR(TABLE_TARGET.FENTITYCODE=Sheet1[5,0]');
      lExcelToTable.FieldMap.Add('DataSetTargetValue.FVALUE=Sheet1[6,0]');
      lExcelToTable.FieldMap.Add('DataSetTargetValue.FORDER=Sheet1[7,0]');
      lExcelToTable.Execute(lMsg);
    finally
       lExcelToTable.free;
    end;
  end;
  AfterInput(lStr);
  TSQLDataSet(DataSetBrokerTargetValue.DataSet).ApplyUpdates;
  DataGrid1.Refresh;
end;

遇到一个问题,每次导入后,内存占用总是增加100M左右的内存,也就是说,连续导入几次,内存就满了,死机了。。关闭窗体以后就自动释放内存了。
请斑竹给看看是什么原因。
回复

使用道具 举报

 楼主| 发表于 2008-3-4 14:35:28 | 显示全部楼层

数据导入占用内存-急!!!

做了一个数据导入的功能,代码如下

procedure TMAINFORM.ToolButton9Click(Sender: TObject);
Var
  lExcelToTable:TExcelToTable;
  lMsg,lStr: String;
begin
  BeforeOpenXLS(lStr);
  lMsg := '';
  OpenDialog.Filter := 'Excel(*.xls)|*.xls';
  if OpenDialog.Execute then
  begin
    lExcelToTable:=TExcelToTable.Create(self);
    try
      lExcelToTable.DataSource:=DataSetBrokerTargetValue;
      lExcelToTable.FileName := OpenDialog.FileName;
      lExcelToTable.StartRow := 1;
      lExcelToTable.EndRow := 9999;
      lExcelToTable.FieldMap.Add('DataSetTargetValue.FTARGETNAME=Sheet1[1,0]');
      lExcelToTable.FieldMap.Add('DataSetTargetValue.FTARGETCODE=Sheet1[2,0]');
      lExcelToTable.FieldMap.Add('DataSetTargetValue.FTARGETTYPECODE=Sheet1[3,0]');
      lExcelToTable.FieldMap.Add('DataSetTargetValue.FUNITNAME=Sheet1[4,0]');
      lExcelToTable.FieldMap.Add('DataSetTargetValue.SUBSTR(TABLE_TARGET.FENTITYCODE=Sheet1[5,0]');
      lExcelToTable.FieldMap.Add('DataSetTargetValue.FVALUE=Sheet1[6,0]');
      lExcelToTable.FieldMap.Add('DataSetTargetValue.FORDER=Sheet1[7,0]');
      lExcelToTable.Execute(lMsg);
    finally
       lExcelToTable.free;
    end;
  end;
  AfterInput(lStr);
  TSQLDataSet(DataSetBrokerTargetValue.DataSet).ApplyUpdates;
  DataGrid1.Refresh;
end;

遇到一个问题,每次导入后,内存占用总是增加100M左右的内存,也就是说,连续导入几次,内存就满了,死机了。。关闭窗体以后就自动释放内存了。
请斑竹给看看是什么原因。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-4 14:37:21 | 显示全部楼层
为什么没有人看帖子回答帖子啊
回复 支持 反对

使用道具 举报

发表于 2008-3-4 14:54:18 | 显示全部楼层
AfterInput(lStr);
BeforeOpenXLS(lStr);
干什么的?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-4 14:56:28 | 显示全部楼层

应该没有关系

function  TMAINFORM.BeforeOpenXLS(var AStr: String):Boolean;
begin
  AStr := TSQLDataSet(DataSetBrokerTargetValue.DataSet).Group.KeyFieldNames;
  TSQLDataSet(DataSetBrokerTargetValue.DataSet).Group.KeyFieldNames := '';
  DataGrid1.ColumnByName('DataGrid1FTARGETCODE').Visible := true;
  DataGrid1.ColumnByName('DataGrid1FUNITNAME').Visible := false;
  DataGrid1.ColumnByName('DataGrid1FTARGETTYPECODE').Visible := false;
  DataGrid1.ColumnByName('DataGrid1SUBSTRTABLE_TARGETFENTITYCODE').Visible := false;
  DataSetBrokerTargetValue.DataSet.EmptyDataSet;
  result := true;
end;

function  TMAINFORM.AfterInput(var AStr: String):Boolean;
begin
  DataGrid1.ColumnByName('DataGrid1FTARGETCODE').Visible := false;
  DataGrid1.ColumnByName('DataGrid1FUNITNAME').Visible := true;
  DataGrid1.ColumnByName('DataGrid1FTARGETTYPECODE').Visible := true;
  DataGrid1.ColumnByName('DataGrid1SUBSTRTABLE_TARGETFENTITYCODE').Visible := true;
// DataSetBrokerTargetValue.DataSet.EmptyDataSet;
  TSQLDataSet(DataSetBrokerTargetValue.DataSet).Group.KeyFieldNames := AStr;
  DataGrid1.FullExpand;
  result := true;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-4 14:57:16 | 显示全部楼层
导入前,删除要导入的重复数据,删除分组
导入后,从新分组
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-4 15:48:44 | 显示全部楼层
自己顶一下,alang 继续啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-4 16:59:57 | 显示全部楼层

导入之前

导入之前

开始.jpg

74.28 KB, 下载次数: 246

回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-4 17:01:10 | 显示全部楼层

导入一次

导入一次

导入5次后,内存占用的数字是 1.5G

第一次.jpg

75.01 KB, 下载次数: 245

回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-4 17:01:51 | 显示全部楼层
我得机组内存是2G,可是客户机器内存是512,所以影响很大
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-8 06:41 , Processed in 0.049996 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表