Запись файла в общий файл большого двоичного объекта Azure построчно с помощью ShareFileClient в функции C # Azure

#c# #azure #azure-functions #azure-blob-storage #storage-file-share

#c# #azure #azure-функции #azure-blob-хранилище #хранилище-общий доступ к файлам

Вопрос:

Я хочу шаг за шагом загружать / создавать файл в общий файл Azure Blob, поскольку я не знаю общий объем данных для записи (чтение из базы данных построчно):

 ShareClient share = new ShareClient(targetBlobStorageConnectionString, directoryName);
share.CreateIfNotExists();
ShareDirectoryClient directory = share.GetDirectoryClient("");
ShareFileClient file = directory.GetFileClient(fileName);
 

Проблема в том, что если я создаю файл (или хочу записать его с помощью overwrite=true) Я должен указать максимальную длину, которую я не знаю.

 var fileStream = file.OpenWrite(overwrite:false,position:0);
...
while(read) {
    var data = System.Text.Encoding.UTF8.GetBytes(GetNewLine(...)  "n");
    fileStream.Write(data, 0, data.Length);
}
fileStream.Close();
 

Я надеялся изменять размер файла с каждой строкой, которую я пишу, но это невозможно с ShareFileClient.

Существуют ли какие-либо другие способы записи файла в общий файловый ресурс Azure Blob построчно?

Комментарии:

1. Вы можете использовать CloudFile класс Microsoft.Azure.Storage.File пространства имен, который имеет множество методов для чтения / записи.

2. Но CloudFile OpenWrite также нуждается в предопределенном размере файла, как и ShareFile.

Ответ №1:

ShareFileClient.Подпись OpenWrite():

 public virtual System.IO.Stream OpenWrite (
  bool overwrite, 
  long position, 
  Azure.Storage.Files.Shares.Models.ShareFileOpenWriteOptions options = default,
  System.Threading.CancellationToken cancellationToken = default
);
 

Не уверен, откуда вы это maxLength взяли. Второй параметр — это «Смещение внутри большого двоичного объекта, с которого нужно начать запись». нет maxLength .

Таким образом, псевдокод будет:

 file = directory.GetFileClient(fileName);

stream = file.OpenWrite(position=0)
byte[] hello = b'hello'
stream.write(hello)
stream.close()

num_bytes_in_hello = size(hello)
stream = file.OpenWrite(position=num_bytes_in_hello)
byte[] world = b'world'
stream.write(world)
stream.close()
 

Тем не менее, это очень дорогая / плохая идея. Не стоит недооценивать стоимость вызова REST API.

Скажем:

  • в вашей базе данных 1 МЛН (M = миллион) строк
  • каждая строка, которую вы записываете, составляет 2 КБ

С вашим кодом вы заплатите 1,000,000/10,000 * 2 * 0.065 = $13 . Они складываются, когда вы делаете это несколько раз в день и каждый день месяца. (2 вызова на строку: write() close() вероятно, вызывает flush REST API)

Вместо этого, если вы будете записывать фрагменты 100 строк за запись, вы заплатите $0.13 .

Фактическое число будет варьироваться в зависимости от региона / уровня и т.д., Но масштаб остается прежним.