#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
.
Фактическое число будет варьироваться в зависимости от региона / уровня и т.д., Но масштаб остается прежним.