-
[.NET] 메모리가 폭발하는 ClosedXML.NET/유용한 라이브러리 2021. 1. 30. 14:34반응형
지난시간엔 상업 목적으로도 사용할 수 있는 ClosedXML 라이브러리에 대해 소개했었다.
https://ddochea.tistory.com/83
무료로 쓸 수 있다는 메리트와 고소당할 수 있는 EPPlus에 대한 경각심을 위해 작성했었는데 ClosedXML에는 한 가지 큰 문제가 있다. 메모리를 너무 많이 쓴다.
아래 소스코드는 5MB 정도 크기의 엑셀파일을 읽어 추가 시트를 생성하고, 새로운 셀에 데이터 입력을 수행한 뒤 저장하는 소스이다. 지난시간 소스에서 약간 변형했다.
using System; using ClosedXML.Excel; namespace ClosedXMLExamples { class Program { static void Main(string[] args) { using (XLWorkbook xl = new XLWorkbook("Test5MB.xlsx")) { var sheet = xl.AddWorksheet($"{xl.Worksheets.Count + 1}"); sheet.Cells("A1").Value = "잘되나요?"; sheet.Cells("A2").Value = "잘됩니다."; xl.Save(); } } } }
저장까지 마친 뒤 메모리 사용량은 아래와 같다.
다음은 EPPlus를 살펴보도록 하자.
using System; using System.IO; using OfficeOpenXml; namespace EPPlus5Example { class Program { static void Main(string[] args) { ExcelPackage.LicenseContext = LicenseContext.NonCommercial; using (var package = new ExcelPackage(new FileInfo("Test5MB.xlsx"))) { var sheet = package.Workbook.Worksheets.Add($"{package.Workbook.Worksheets.Count + 1}"); sheet.Cells["A1"].Value = "잘되나요?"; sheet.Cells["A2"].Value = "잘됩니다."; package.Save(); } } } }
이 소스를 여러번 수행한다고 해도 GC로 인해 메모리가 극단적으로까지 올라가진 않지만, 5MB 파일 다루는데 1GB의 메모리가 소요되는 것은 문제라고 볼 수 있다.
현재 회사에서 서비스중인(곧 제거될) 사내직원용 웹 어플리케이션이 ClosedXML을 ASP.NET 에 붙여서 사용한다. 그래서 용량이 조금이라도 큰 엑셀파일이 들어오면 웹서비스가 뻗어버리곤 했다.
64bit OS 기준 IIS 웹풀의 메모리 기본 사용량이 4GB이고, 넘어가면 재생된다고 한다. 공식답변은 아니지만 Telerik 담당자가 답변한거라 신뢰는 간다.
내가 찾아본 답변은 아래와 같다. Posted by Community Admin on 22-Aug-2014 00:00 이다.
https://community-archive.progress.com/forums/00297/46072.html
결론 : 돈이 최고다. EPPlus를 사도록 하자.
반응형'.NET > 유용한 라이브러리' 카테고리의 다른 글