.NET Framework 4.7.2에서 간단하게 테스트 코드를 작성한 후 증상을 확인하였습니다.
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp2
{
internal class Program
{
static void Main(string[] args)
{
var sw = Stopwatch.StartNew();
DataTable dt = null;
for (var i = 0; i < 1000; i++)
{
dt = MakeTempDataTable(dt);
Console.WriteLine(sw.Elapsed);
sw.Restart();
}
}
static DataTable MakeTempDataTable(DataTable dt)
{
if (dt is null)
dt = new DataTable("Temp Table");
else
{
//dt.Rows.Clear();
//dt.Columns.Clear();
dt = new DataTable("Temp Table");
}
for (var columns = 0; columns < 1000; columns++)
dt.Columns.Add(new DataColumn($"{columns}1"));
for (var row = 0; row < 10000; row++)
{
var newRow = dt.NewRow();
for (var columns = 0; columns < 1000; columns++)
{
newRow[columns] = columns;
}
}
return dt;
}
}
}
dt.Rows.Clear()
및 dt.Columns.Clear()
를 하더라도 DataTable
인스턴스가 가지고 있는 메모리 자원이 GC이후에도 해제되지 않고 계속 증가하는 것을 확인할 수 있었습니다.
DataTable 인스턴스를 새로 만들어서 사용했을 경우 그런 문제가 없었습니다.
결론은, @nyjin님이 제안한 것처럼 그냥 DataTable
의 인스턴스를 새로 만들어서 사용해보세요.