【发布时间】:2020-05-19 14:54:53
【问题描述】:
我正在尝试创建 CSV 文件并将其导入 Azure 存储帐户。
public static void ExportCsvToStorageAccount(string fileName, CloudBlobContainer container, IEnumerable<ReportRow> reportEntries)
{
using (var ms = new MemoryStream())
{
using (var file = new StreamWriter(ms))
{
file.WriteLine("Date,StoreId,ItemId,SalesQuantity");
foreach (var row in reportEntries)
{
var line = $"\"{row.Date}\",\"{row.StoreId}\",\"{row.ItemId}\",\"{row.SalesQuantity}\"";
file.WriteLine(line);
}
var blockBlob = container.GetBlockBlobReference($"{fileName}.csv");
ms.Position = 0;
blockBlob.UploadFromStream(ms);
}
}
}
我正在内存中创建文件,然后将其复制并上传到 azure。
我的“问题”是为此我需要先将整个文件保存在内存中,然后才开始复制(如果文件太大并且机器内存不足,这可能是一个问题)。
理想情况下,我可以直接写入 azure,或者在我填满内存流缓冲区后立即将其复制到 azure,然后在其顶部再次写入,而不是在内存流缓冲区中分配更多空间。
有没有办法直接写入 Azure? (目的是节省内存)
编辑:
通过 Gaurav Mantri-AIS 输入的答案,我想出了这个(因为我有超过 50000 个条目,这是块的限制),
public static void ExportCSVToStorageAccount(string fileName, CloudBlobContainer container, IEnumerable<RawReportRow> reportEntries)
{
var blob = container.GetAppendBlobReference($"{fileName}.csv");
blob.CreateOrReplace();
blob.AppendText($"Date,StoreId,ItemId,SalesQuantity{Environment.NewLine}");
foreach (var row in reportEntries)
{
var line = $"\"{row.Date}\",\"{row.StoreId}\",\"{row.ItemId}\",\"{row.SalesQuantity}\"{Environment.NewLine}";
blob.AppendText(line);
}
}
此解决方案的问题是耗时过长,从 5 分钟到一个多小时不等。我可能做错了什么,因为 AppendBlob 应该执行良好的追加,但似乎并非如此。
关于如何稍微提高写入速度的任何想法?
【问题讨论】:
-
也许是 BlockBlobClient 类? docs.microsoft.com/en-us/dotnet/api/…
-
一般来说,AppendText 和 Append 方法有一个最大限制 - 每个追加 100MB。还要确保在最后添加 blob.Flush 调用以实际执行上传。
标签: c# stream azure-blob-storage