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);
}
}
Wo würde ich den Dateinamen für die Datei im Speicher angeben? – andrewb
Sie können den Dateinamen in der container.GetBlockBlobReference-Methode angeben. Ich habe meinem Beispielcode eine Codezeile hinzugefügt. – Amor