현재 거대한 배치 프로그램의 메모리 사용을 최적화하고 있습니다. 대부분의 메모리는 다른 DataTable에서 사용됩니다. 내 DataTable dtTest는 약 260MB를 사용하고 있습니다.C# 최적화 메모리 사용 : DataTable에 의해 청구 된 메모리를 해제하는 방법
"What is the memory overhead of storing data in a .NET DataTable?"스레드의 허용 대답의 제안처럼 DataTable에서 관련 데이터를 이동하려고합니다. 내가 지우기를 사용하여 폐기하고 다음 스레드에서 제안되어 있기 때문에 null로 설정하고있어
GC.Collect(); // force the garbage collector to free memory
// First stop point - Total process memory (taskmanager) = 900 MB
List<ExpandoObject> ExpandoList = new List<ExpandoObject>();
foreach (DataRow drTest in dtTest.Rows)
{
dynamic ExpandoItem = new ExpandoObject();
ExpandoItem.FieldName = drTest["FieldName"].ToString();
ExpandoList.Add(ExpandoItem);
}
// Second stop point - Total process memory (taskmanager) = 1055 MB
dtTest.Clear();
dtTest.Dispose();
dtTest = null;
GC.Collect(); // force the garbage collector to free memory
// Third stop point - Total process memory (taskmanager) = 1081 MB (wtf? even more!)
:
Datatable.Dispose() will make it remove from memory?가 종점 코멘트가 포인트가에 메모리 사용량을 확인하십시오이 내 코드입니다. 나는 또한 (DataTable dtTest = ...)를 사용하여 시도했지만 결과는 동일했다.
내가 뭘 잘못하고 있니? DataTable에서 데이터를 축소하는 더 좋은 방법이 있습니까?
메모리 프로파일 러를 실행하고 데이터 테이블 (또는 큰 크기의 것)이 아직 참조되고 있는지 확인하십시오. – fejesjoco
dtTest는 어디에서 왔습니까? 메소드 호출에 대한 매개 변수입니까? 그렇다면 호출 메소드에 의해 계속 참조되므로 가비지 콜렉션에 적합하지 않습니다. –
같은 기능에서 온 것입니다. 문제는 작업 관리자를 사용하여 메모리 크기를 확인하는 것이 었습니다. 나는 .NET에 예약 된 메모리가 있다는 것을 알지 못했다. – Undercover1989