将数据表保存到Azure blob时如何使用GZip

时间:2017-05-11 22:31:08

标签: c# azure azure-storage-blobs

我编写了一个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);
    }
}

1 个答案:

答案 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);
    }
}