我编写了一个C#应用程序,用于将SQL Server表中的数据存档到Azure blob中。归档由JSON文件配置,从JSON文件中检索的值决定了要检索和归档的数据。
数据需要以这种格式存储在blob名称中
year/month/day/hour/older-than-[query-date]
其中query-date是当前日期减去JSON文件中指定的天数。
我遇到的问题是如何将压缩纳入流程。
我们希望压缩存档的数据以节省空间。
目前,JSON设置意味着任何只有30天的数据都应归档,但这会产生大约370万行数据,因此有时会出现内存异常。
无论如何,如何使用GZip压缩每行数据到Azure blob?这是现有代码。
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);
}
}
答案 0 :(得分:1)
我建议您将数据写入MemoryStream。然后我们可以压缩内存流并将其写入Azure Blob服务。以下代码供您参考。
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);
}
}