2017-04-03 6 views
1

dataTable에서 새 워크 시트를 추가해야합니다.ClosedXML. 메모리 누수 중 Workbook.Save()

workbook.Worksheets.Add(dataTable); 
workbook.Save(); 
workbook = new XLWorkbook(filePath); //reload file to avoid exception at next saving 

내 처리는 128MB 메모리를 사용하지만, Workbook.Save() 후이 번호는 382 메가에 오르지됩니다 :이 작업을 위해 나는 ClosedXML를 사용합니다. 다음 워크 시트 메모리 사용량이 464Mb에서 619Mb로 증가했습니다. 그러나이 시점에서 실제 파일은 1.6Mb였습니다.

왜 이런 이유가있을 수 있습니까?

답변

1

이 단계에서 인 ClosedXML의 최신 버전으로 업그레이드하십시오. Release 구성에서 코드를 실행하고 XLWorkbook을 배치 한 후에 다음 코드를 추가합니다

GC.Collect(); 
GC.WaitForPendingFinalizers(); 
GC.Collect(); 

당신은 메모리가 다시 허용 수준으로 떨어주의해야한다.

3

XLWorkbookIDisposable을 구현하며 보유한 리소스를 모두 해제해야합니다. 이 작업을 수행하지 않으면 인스턴스가 가비지 수집 될 때만 풀려납니다 (XLWorkbook이 올바른 마무리자를 구현한다고 가정). 나중에 가끔 발생합니다. 더 나은 물론

workbook.Save(); 
workbook.Dispose(); // < important 
workbook = new XLWorkbook(filePath); 

using 문에 workbook 포장 또는 적어도 예외에 방출을 보장하기 위해 tryfinally을 사용하는 것입니다,하지만 직접 질문에 관련되지 않은 :이처럼해야한다.

+1

응용 프로그램을'Debug' 구성으로 실행하면 (일반적으로 최적화가 꺼져 있음을 의미 함), 예상 한 경우 폐기 된 객체가 실제로 삭제된다는 보장이 없습니다. 객체는 대개 디버거에서 볼 수 있도록 보관됩니다. 폐기 된 객체가 예상 할 때 가비지 수집되도록 'Release' 설정으로 전환하십시오. –