本帖最后由 niss 于 2012-11-01 18:13:49 编辑

解决方案 »

  1.   

    仅仅是测试的demo,没有多线程,只拿了一个600多兆的文本文件来测试,不管是每次读两万还是每次读两千,情况都一样,内存一直往上涨,涨到接近200M,时间花了超过100秒,我郁闷了,有这么慢吗
      

  2.   

    datatable的数据就是存放在内存中的
      

  3.   

     好像是Clear方法只清除DataTable中的行,但是DataTable的表结构还在的。
    清除内存是Dispose方法。再等下其他高手看看。
      

  4.   

    关注中,我是这样想的,600多M的文件,你一次性读到内存中放在DataTable中,必然会消耗很多内存,建议将文件分割成多个小文件,然后分批导入。也就是说,一次性读的数据太多必然导致内存消耗很大
      

  5.   

    我是用StreamReader读的,每次读两万条,然后上传,处理完毕后DataTable.Clear(),清空,再读,如此循环,按理说不应该啊,而且文件大小是60多M
      

  6.   

    555,SqlBulkCopy很平稳,我日他仙人板板哟,Oracle能给力点不
      

  7.   

    写了个类实现IDataReader,SqlBulkCopy无问题,明天去试试OracleBulkCopy是否还是内存泄漏,要逼疯了,或者是因为某些dll没有引用才导致?
      

  8.   

    你就不能用 dataTable, 他是内存啊,你用 DataReader啊, 简单方式using System.Data.OracleClient;private void Test()
    {OracleDataReader oreader ;
       try
       {
           using(OracleConnection conn = new OracleConnection ("DBConnectionsString"))
        {
         
        OracleCommand cmd = OracleCommand("SELECT * FROM TBNAME WHERE 0=..............");
        conn.Open(); 
        oreader = cmd.ExecuteDataReader();
        while(oreader.Read())
        {
          string name =  !(oreader["name"] is DbNull)?oreader["name"]:null;
          //其他一样。
          
        }
        }
       }
       finaliy
       {
          if(!oreader.IsClose)
          {
            oreader.Close();
          }
       }
    }
      

  9.   

    已确定OracleBulkCopy存在严重的内存泄漏问题,我写了个类实现IDataReader,用于从文件流式读入数据,在SqlBulkCopy下内存一点都不涨,维持在10多M的水平,但OracleBulkCopy涨到300多M,严重情况报DMA(记不得是MDA还是啥,反正是和硬件存取有关)错误,痛苦啊
      

  10.   

    我也遇到此问题。
    我是导入sqlserver
    发现 内存一次性读datatable太大会溢出,分批次又突出不了SqlBulkCopy 速度。
    能加qq331224655 分享一下 你的 IDataReader 怎么实现的吗
      

  11.   

    关键点是SchemaTable,这个作为参数传入,这样大部分的接口都可以被很快实现,至于SchemaTable怎么实现,直接从数据库读出DestinationTableName的SchemaTable就行啦