大家看看下面的程序,循环有10000--30000之间,数据库是Access,但关闭应用程序后,内存又回来了,说明不是内存泄露,每次循环内存大概会上升500K左右,请高手指教;
var
    memoryStream :TMemoryStream;
    tmpdataset: TADODataSet;
    tf: TBlobField;
begin
   memoryStream := TMemoryStream.Create();
   for i:= 1 to 10000 do
    begin
      memoryStream.LoadFromFile(ExtractFilePath(Application.ExeName) +'\test.bmp');
      tmpdataset.Append();
      tf := tmpdataset.FieldByName('BITMAP') as TBlobField;
      tf.LoadFromStream(memoryStream);
      tmpdataset.Post();
      Application.ProcessMessages;    end;
   memoryStream.Free;end

解决方案 »

  1.   

    for i:= 1 to 10000 do
        begin
           memoryStream := TMemoryStream.Create();
          memoryStream.LoadFromFile(ExtractFilePath(Application.ExeName) +'\test.bmp');
          tmpdataset.Append();
          tf := tmpdataset.FieldByName('BITMAP') as TBlobField;
          tf.LoadFromStream(memoryStream);
          tmpdataset.Post();
          Application.ProcessMessages;
           memoryStream.Free;
        end;
    写到循环外,最后才释放内存,肯定不合适了
      
      

  2.   

    内存被数据集tmpdataset站着,换一个算法,一次打开tmpdataset的记录数最好在几十条以下。
      

  3.   

    以前我看见有个贴说memoryStream.Free这样释放还不是最彻底,还有一种彻底方法释放是
    freein(memoryStream),不过具体函数名我不记得了,跟freein这个有点象,你查查看,这个对你有没有用
      

  4.   

    这样试试,每次装入大图片时候先清空与adodataset相连的数据,然后再append
    for i:= 1 to 10000 do
        begin
        adodataset.close;
        adodataset.commandtext :='select BITMAP,num where num=-1';//num是流水号,返回0个记录
        adodataset.open;
         .....
       
      

  5.   

    drift1981 第一次 的做法效率低下,有必要每次创建马?
     lijinghe1 的说法有点道理
    你执行完以后 close结果集内存会降下来吗?如果没有完全降下是 ado驱动也有一部份在缓存区中
    drift1981 第一次 的做法还是效率低下有必要每次close open?
    用query  不就的了
    inser into (:p)
    param('p').loadfromstream
      

  6.   

    最后面应该用FreeAndNil(memoryStream);偶原来一个读取的程序也是这样的1w条记录(每图片30KB左右)吃了我将近1G虚拟内存,300多M物理内存。
      

  7.   

    谢谢你们的关注,我已经解决了, lijinghe1(风舞肥羊)说的对,内存被那个Dataset占着,在这之前我也测试出来了,现在
    我找到了一个解决的方法,和大家分享一下var
        strSQL : String;
        tmpdataset: TADODataSet;
      
    begin
       strSQL := 'insert into test(picture) values(:picture)';
       tmpdataset.close();
       for i:= 1 to 10000 do
        begin
          tmpdatasetparemater.ParamByName('picture').LoadFromFile(e:\test.bmp',ftBlob);
          tmpdataset.ExecSQL();
          Application.ProcessMessages;
        end;
      end
      

  8.   

    我昨晚发过贴子就回家了,然后在家里写出来了,早知道newyj(吴刚vs西西弗)写好了,我也不用想了,呵呵,开心,谢谢大家的关注,过一会揭贴