2017-05-11 2 views
0

Ich habe eine C# -Anwendung geschrieben, um Daten aus einer SQL Server-Tabelle in einen Azure-Blob zu archivieren. Die Archivierung wird durch eine JSON-Datei konfiguriert, und die aus der JSON-Datei abgerufenen Werte legen fest, welche Daten abgerufen und archiviert werden.Verwendung von GZip beim Speichern von Datentypen im Azure-Blob

Die Daten müssen in diesem Format in einem Blob Namen gespeichert werden

year/month/day/hour/older-than-[query-date] 

Wo Abfrage-date das aktuelle Datum minus eine Anzahl von Tagen in der JSON-Datei angegeben.

Das Problem, das ich habe, ist wie Komprimierung in den Prozess zu integrieren.

Wir möchten die zu archivierenden Daten komprimieren, um Platz zu sparen.

Derzeit bedeutet die JSON-Einstellungen, dass alle Daten nur als 30 Tage archiviert werden sollten, aber dies ergibt etwa 3,7 Millionen Zeilen von Daten, so dass ich manchmal aus Speicherausnahmen bekomme.

Unabhängig davon, wie kann ich mit GZip jede Datenzeile zum Azure-Blob komprimieren? Hier ist der vorhandene Code.

using (SqlDataAdapter adr = new SqlDataAdapter(comm)) 
{ 
    adr.Fill(data); 
    data.TableName = config.TargetTableName; 
} 

CloudStorageAccount storageAccount = CloudStorageAccount.Parse("blank"); 
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 
blobClient.DefaultRequestOptions.ParallelOperationThreadCount = 20; 
blobClient.DefaultRequestOptions.MaximumExecutionTime = TimeSpan.FromMinutes(20); 
blobClient.DefaultRequestOptions.ServerTimeout = TimeSpan.FromMinutes(20); 
CloudBlobContainer container = blobClient.GetContainerReference(config.AzureContainerName); 

StringBuilder jsonData = new StringBuilder(); 
CloudBlockBlob blob = container.GetBlockBlobReference($"{config.TargetTableName}/{DateTime.Now.Year}/{DateTime.Now.Month}/{DateTime.Now.Day}/{DateTime.Now.Hour}/Older-Than-{queryParameter.Value}.log"); 
using (var writeStream = blob.OpenWrite()) 
{ 
    using (var writer = new StreamWriter(writeStream)) 
    { 
     data.WriteXml(writer, XmlWriteMode.WriteSchema); 
    } 
} 

Antwort

1

Ich schlage vor, Sie schreiben Ihre Daten in einen MemoryStream. Dann können wir den Speicherstream komprimieren und in Azure Blob Service schreiben. Code unten ist für Ihre Referenz.

CloudBlockBlob blob = container.GetBlockBlobReference($"{config.TargetTableName}/{DateTime.Now.Year}/{DateTime.Now.Month}/{DateTime.Now.Day}/{DateTime.Now.Hour}/Older-Than-{queryParameter.Value}.log"); 

using (var writeStream = blob.OpenWrite()) 
{ 
    MemoryStream memoryStream = new MemoryStream(); 
    using (var writer = new StreamWriter(memoryStream)) 
    { 
     data.WriteXml(writer, XmlWriteMode.WriteSchema); 
    } 

    using (GZipStream compressionStream = new GZipStream(writeStream, 
        CompressionMode.Compress)) 
    { 
     memoryStream.Position = 0; 
     memoryStream.CopyTo(compressionStream); 
    } 
} 
+0

Wo würde ich den Dateinamen für die Datei im Speicher angeben? – andrewb

+0

Sie können den Dateinamen in der container.GetBlockBlobReference-Methode angeben. Ich habe meinem Beispielcode eine Codezeile hinzugefügt. – Amor

Verwandte Themen