2017-01-26 2 views
0

Я загружаю содержимое AppendBlob с помощью метода DownloadText, и я испытываю утечку памяти. С кем это уже случилось? Код, который я использую:Утечка памяти с помощью AppendBlob

private string[] GetBlobLines(CloudAppendBlob blob) 
    { 
     string text = ""; 
     try 
     { 
      lock (_blobContainerLock) 
      { 
       text = blob.DownloadText(); 
      } 
     } 
     catch (Exception e) 
     { 
      WriteToTable(MessageType.ERROR, "Error reading log lines: " + e.Message); 
     } 

     return text.Split('\n'); ; 
    } 


    public string GetLastLogRows(uint count) 
    { 
     var sb = new StringBuilder(); 
     var blob = _currentBlob; 

     int lineCount = 0; 
     int blobOffset = 0; 

     while (lineCount < count) 
     { 
      var lines = GetBlobLines(blob); 
      var blobLineCount = lines.Count(); 

      var i = blobLineCount - 1; 
      while ((lineCount < count) && (i > -1)) 
      { 
       sb.AppendLine(lines[i--]); 
       lineCount++; 
      } 

      if (lineCount < count) 
      { 
       blobOffset++; 
       blob = _blobContainer.GetAppendBlobReference($"{BLOB_PREFIX}{_currentBlobIdx - blobOffset}"); 

       if (!blob.Exists()) 
        break; 
      } 
     } 

     return sb.ToString(); 
    } 
+0

Возможно, у вас ошибка программирования. Можете ли вы разместить свой код. Наверное, вам не хватает использования. – Peter

+0

Я не могу найти метод DownloadText с аргументами в документации microsoft https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.blob.cloudappendblob.aspx, это собственный метод расширения, который вы реализовали ? Или вы используете более старую версию DLL-хранилища? – Peter

+0

Нет, все 4 параметра по умолчанию равны null. – azrael

ответ

0

По моему мнению, каждая запись журнала, которую вы сохранили, добавляется символом новой строки (\ n). Вы используете GetLastLogRows для получения записей журнала определенного номера в обратном порядке из вашего AppendBlob. Чтобы получить определенные записи журнала, вам необходимо загрузить весь файл AppendBlob. На данный момент утечка памяти является вопросом времени, когда размер содержимого журнала увеличивается. Вы можете использовать Fiddler, чтобы проверить подробный запрос при вызове CloudAppendBlob.DownloadText или использовать официальный инструмент Microsoft Azure Storage Explorer, чтобы проверить размер файла AppendBlob.

if (lineCount < count) 
{ 
    blobOffset++; 
    blob = _blobContainer.GetAppendBlobReference($"{BLOB_PREFIX}{_currentBlobIdx - blobOffset}"); 

    if (!blob.Exists()) 
     break; 
} 

Если я понимаю, приведенный выше код правильно, вы бы проверить, есть ли там новый файл AppendBlob создается, когда количество текущих записей журнала меньше требуемого параметра count из GetLastLogRows. И если он существует, вы загрузите новый созданный файл AppendBlob и объедините записи журнала с записями из предыдущего файла AppendBlob. На этом этапе порядок ваших зарегистрированных записей журнала будет нарушен.

Как я уже говорил, добавление blob оптимизировано для операций добавления. Я предположил, что вы можете использовать Table Storage для хранения ваших журналов. И вы можете следовать этому issue для разработки ПК и РК, затем используйте TableQuery.Take для получения последних записей из вашего хранилища таблиц. Вы можете обратиться к этому document для лучшего понимания этого метода.