【问题标题】:How to use GZip when saving datatable to Azure blob将数据表保存到 Azure blob 时如何使用 GZip
【发布时间】:2017-10-11 02:48:13
【问题描述】:

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

【问题讨论】:

    标签: c# azure azure-blob-storage


    【解决方案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);
        }
    }
    

    【讨论】:

    • 我应该在哪里为存储中的文件指定文件名?
    • 您可以在 container.GetBlockBlobReference 方法中指定文件名。我在示例代码中添加了一行代码。
    猜你喜欢
    • 1970-01-01
    • 2016-08-30
    • 2020-05-20
    • 2021-08-22
    • 2018-01-11
    • 2019-07-06
    • 2021-04-29
    • 2021-03-19
    • 1970-01-01
    相关资源
    最近更新 更多