2017-05-11 33 views
0

我編寫了一個C#應用程序來將數據從SQL Server表中歸檔到Azure blob中。歸檔由JSON文件配置,並且從JSON文件中檢索的值指示要檢索和歸檔的數據。將數據表保存到Azure blob時如何使用GZip

的數據需要存儲在BLOB名稱以這種格式

year/month/day/hour/older-than-[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

我建議你將你的數據寫入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); 
    } 
} 
+0

我在哪裏指定存儲中文件的文件名? – andrewb

+0

您可以在container.GetBlockBlobReference方法中指定文件名。我在示例代碼中添加了一行代碼。 – Amor

相關問題