Проблемы памяти с рабочими листами - PullRequest
0 голосов
/ 16 января 2019

Я вижу чрезмерное использование памяти при попытке получить имена всех рабочих листов в рабочей книге. Как только я пытаюсь открыть рабочие листы внутри пакета (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;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...