我正在使用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。
因此
提前致谢。
答案 0 :(得分:1)
经过多次尝试后,我将这段代码包装在一个单独的进程中,以便操作系统在退出后进行清理。这是我能找到的最佳解决方案。