2017-01-26 4 views
0

DownloadText 메서드를 사용하여 AppendBlob 내용을 다운로드 중이며 메모리 누수가 발생합니다. 그것은 이미 누구에게 일어 났습니까? 내가 사용하는 코드 :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

Microsoft 문서 https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.blob.cloudappendblob.aspx에서 인수가있는 DownloadText 메서드를 찾을 수 없습니다. 이것은 사용자가 구현 한 자체 확장 메서드입니다. ? 또는 이전 버전의 저장소 DLL을 사용하고 있습니까? – Peter

+0

아니요, 모든 4 개의 매개 변수는 기본적으로 null입니다. – azrael

답변

0

필자가 저장 한 각 로그 레코드에는 개행 문자 (\ n)가 추가됩니다. GetLastLogRows을 사용하면 AppendBlob에서 역순으로 특정 번호 로그 레코드를 검색 할 수 있습니다. 특정 로그 레코드를 검색하려면 전체 AppendBlob 파일을 다운로드해야합니다. 이 시점에서 로그 누락 크기가 증가함에 따라 메모리 누수가 발생합니다. CloudAppendBlob.DownloadText을 호출 할 때 Fiddler을 사용하여 자세한 요청을 확인하거나 공식 도구 Microsoft Azure Storage Explorer을 사용하여 AppendBlob 파일의 크기를 확인할 수 있습니다.

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

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

내가 제대로 위의 코드를 이해한다면, 당신은 현재의 로그 레코드의 수를 원하는 매개 변수 GetLastLogRowscount보다 작은 경우 생성 된 새 AppendBlob 파일이 있는지 여부를 확인합니다. 존재하는 경우 새로 작성한 AppendBlob 파일을 다운로드하고 로그 레코드를 이전 AppendBlob 파일의 레코드와 결합합니다. 이 시점에서 검색된 로그 레코드의 순서가 혼란됩니다.

알다시피, 추가 BLOB는 추가 작업에 최적화되어 있습니다. Table Storage을 사용하여 로그를 저장할 수 있다고 가정했습니다. 그리고 이것을 issue에 따라 PK와 RK를 설계 한 다음 TableQuery.Take을 사용하여 테이블 저장소에서 최신 레코드를 검색 할 수 있습니다. 이 방법을 더 잘 이해하려면이 document을 참조하십시오.

관련 문제