Я пытаюсь создать файл 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.
Моя «проблема» в том, что для этого мне нужно сначала сохранить весь файл в памяти и только затем начать копирование (это может быть проблемой, если файл слишком большой, а на машине мало ram).
В идеале я мог бы писать прямо в azure или как только я заполнил свой буфер потока памяти, я бы скопировал его в azure, а затем снова написал бы поверх него вместо того, чтобы выделять больше места в me буфер потока памяти.
Есть ли способ записать прямо в 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 должен хорошо работать с добавлением, но, похоже, это не так.
Есть идеи, как немного улучшить скорость записи?