2017-01-26 1 views
0

Ich lade AppendBlob Inhalt mit DownloadText Methode und ich habe ein Speicherleck. Ist es schon jemandem passiert? Der Code, den ich verwende:Speicherleck mit 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

Sie haben wahrscheinlich einen Programmierfehler. Können Sie Ihren Code posten? Ich schätze, du verpasst eine Verwendung. – Peter

+0

Ich kann die DownloadText-Methode mit Argumenten in der Microsoft-Dokumentation https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.blob.cloudappendblob.aspx nicht finden, ist dies eine eigene Erweiterungsmethode, die Sie implementiert haben ? Oder verwenden Sie eine ältere Version der Speicher-DLLs? – Peter

+0

Nein, alle 4 Parameter sind standardmäßig Null. – azrael

Antwort

0

Meinem Verständnis nach wird jeder Protokolleintrag, den Sie gespeichert haben, mit einem Zeilenvorschubzeichen (\ n) versehen. Sie verwenden GetLastLogRows, um die spezifischen Nummernlog-Datensätze in umgekehrter Reihenfolge von Ihrem AppendBlob abzurufen. Um die spezifischen Protokolldatensätze abzurufen, müssen Sie die gesamte AppendBlob-Datei herunterladen. Zu diesem Zeitpunkt sind Speicherlecks eine Frage der Zeit, da die Größe des Protokollinhalts zunimmt. Sie können Fiddler verwenden, um die detaillierte Anfrage zu überprüfen, wenn Sie CloudAppendBlob.DownloadText aufrufen, oder verwenden Sie das offizielle Tool Microsoft Azure Storage Explorer, um die Größe Ihrer AppendBlob-Datei zu überprüfen.

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

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

Wenn ich den obigen Code richtig verstehen, möchten Sie überprüfen, ob es neue AppendBlob-Datei erstellt, wenn die Anzahl der aktuellen Protokollsätze ist kleiner als der gewünschte Parameter count von GetLastLogRows. Und wenn es existiert, würden Sie die neu erstellte AppendBlob-Datei herunterladen und die Protokolldatensätze mit den Datensätzen aus der vorherigen AppendBlob-Datei kombinieren. Zu diesem Zeitpunkt ist die Reihenfolge der abgerufenen Protokolldatensätze gestört.

Wie ich weiß, ist ein Append-Blob für Append-Operationen optimiert. Ich nahm an, dass Sie Table Storage nutzen können, um Ihre Protokolle zu speichern. Und Sie könnten dieser issue folgen, um PK und RK zu entwerfen, und dann TableQuery.Take verwenden, um die neuesten Datensätze aus Ihrem Tabellenspeicher abzurufen. Für ein besseres Verständnis dieser Methode können Sie sich auf diese document beziehen.