Я вижу чрезмерное использование памяти при попытке получить имена всех рабочих листов в рабочей книге. Как только я пытаюсь открыть рабочие листы внутри пакета (excelPackage.Workbook.Worksheets), мой тест использует ~ 400 МБ памяти и занимает около 20 секунд, чтобы завершить эту строку кода. Мне интересно, является ли это нормальным значением нагрузки для инструмента, который будет использоваться для файла .xlsx размером 30 МБ с 3 рабочими листами. Моя большая проблема заключается в том, что инструмент, похоже, сохраняет около 1,2 ГБ памяти даже после того, как я выполнил эту задачу ListWorksheets. Итак, а) 1,2 ГБ кажется чрезмерным для файла размером 30 МБ и б) следует освободить память, когда инструмент завершит работу, не так ли?
График памяти
[TestMethod]
public void WorkBook_OpenAndCloseWorkBook_MemoryBehavesCorrectly()
{
var template = Path.Combine(testDocumentsRootDirectory, @"Templates\30MB_File.xlsx");
var outputSmokeTest = Path.Combine(testDocumentsRootDirectory, @"Results\MemTest.xlsx");
for (int x = 20; x > 0; x--)
{
smokeTestWorkbook = new Workbook(key);
if (File.Exists(outputSmokeTest))
File.Delete(outputSmokeTest);
smokeTestWorkbook.Open(template);
var worksheets = smokeTestWorkbook.ListWorksheets();
smokeTestWorkbook.SaveAs(outputSmokeTest);
smokeTestWorkbook.Close();
//GC.Collect();
System.Threading.Thread.Sleep(5000);
}
}
/// <summary>
/// Opens a reference to the workbook
/// </summary>
/// <returns></returns>
public void Open(string workbookPath)
{
var loggerString = "Open";
if (File.Exists(workbookPath))
{
try
{
logger.Track(loggerString);
excelPackage = new ExcelPackage(new FileInfo(workbookPath));
}
catch (Exception ex)
{
logger.TrackException(loggerString, ex);
}
}
}
/// <summary>
/// Obtain an array of worksheet names
/// </summary>
/// <returns></returns>
public string[] ListWorksheets()
{
var returnValue = new List<string>();
var loggerString = "ListWorksheets";
try
{
logger.Track(loggerString);
returnValue.AddRange(excelPackage.Workbook.Worksheets.Select(excelWorksheet => excelWorksheet.Name));
}
catch (Exception ex)
{
logger.TrackException(loggerString, ex);
throw;
}
return returnValue.ToArray();
}
/// <summary>
/// SaveAs document
/// </summary>
/// <param name="filename"></param>
/// <returns></returns>
public void SaveAs(string filename)
{
var loggerString = "SaveAs";
try
{
logger.Track(loggerString);
excelPackage.SaveAs(new FileInfo(filename));
}
catch (Exception ex)
{
logger.TrackException(loggerString, ex);
throw;
}
}
/// <summary>
/// Closes the document
/// </summary>
/// <returns></returns>
public void Close()
{
var loggerString = "Close";
try
{
logger.Track(loggerString);
excelPackage.Dispose();
}
catch (Exception ex)
{
logger.TrackException(loggerString, ex);
throw;
}
}