VFPOledb驱动程序可能存在内存泄漏?

时间:2011-04-25 10:21:52

标签: c# memory-leaks oledb visual-foxpro

我正在使用vfpoledb驱动程序在C#中开发一个程序,该程序将大约100,000行插入到版本4 dbase文件(* .dbf)中。

返回连接字符串的方法如下,

internal string GetDBaseConnectionString(string path)
{            
  return "Provider=vfpoledb;Data Source=" + path + ";Collating Sequence=general;";            
}

执行插入的代码段如下,

        internal long Execute()
        {
            OleDbConnection con = null;
            OleDbCommand cmd = null;

            try
            {
                con = new OleDbConnection(AppSettings.Current.GetDBaseConnectionString(_dbfPath));
                con.Open();

                cmd = new OleDbCommand(_sql);
                cmd.Connection = con;                
                cmd.CommandTimeout = AppSettings.Current.DefaultCommandTimeOutMinutes;

                long rowIndex = 0;
                int countInBatch = 0;

                for (int i = 0; i < _reader.FieldCount; i++)
                    cmd.Parameters.Add(new OleDbParameter());                

                while (_reader.Read())
                {
                    for (int i = 0; i < cmd.Parameters.Count; i++)
                        cmd.Parameters[i].Value = _reader.GetValue(i);

                    cmd.ExecuteNonQuery();

                    rowIndex += 1;

                    if (_progressChangeRowCount > 0)
                    {
                        countInBatch += 1;

                        if (countInBatch >= _progressChangeRowCount)
                        {
                            countInBatch = 0;

                            ProgressChangedEventArgs args = new ProgressChangedEventArgs(rowIndex);
                            this.OnProgressChanged(args);
                        }
                    }
                }

                _reader.Close();

                con.Close();
                con.Dispose();
                cmd.Dispose();

                return rowIndex;
            }
            catch (Exception ex)
            {                
                if (con != null)
                {
                    con.Close();
                    con.Close();
                }

                if (cmd != null)
                    cmd.Dispose();

                if(_reader!= null)
                    _reader.Close();

                throw ex;
            }
        }

此段同时在三个线程中运行。因此,数据从3个SqlDataReaders同时插入到三个dbase文件中。

我的问题是我的程序每分钟吃掉大约50-100 MB,它只会增加,直到我关闭程序。由于这个System.OutOfMemoryExceptions在程序中引发,操作系统很快将其关闭。我可以看到任务管理器中的页面文件使用率从540 MB到2.2 GB。

我已将其缩小到cmd.ExecuteNonQuery()行;如果我注释掉这一行,那么程序执行的内存只会增加大约1或2 MB。

因此

  1. 这可能是由于VFPOledb驱动程序中的内存泄漏造成的吗?我正在使用最新版本9
  2. 如果是这样我该怎么做才能应付它? (将其作为一个单独的过程包装,以便操作系统清除退出声音上的任何内存泄漏,但应该是最后的手段)
  3. 您是否看到或知道可能导致此问题的任何其他错误?
  4. 更换驱动程序可能有所帮助,但Jet驱动程序的速度非常缓慢。 dbase批量插入还有其他选择吗?我在Efficient way to bulk insert into Dbase (.dbf) files
  5. 也问了这个问题

    提前致谢。

1 个答案:

答案 0 :(得分:1)

经过多次尝试后,我将这段代码包装在一个单独的进程中,以便操作系统在退出后进行清理。这是我能找到的最佳解决方案。