繁体   English   中英

C# Azure Function 逐行写一个文件到Azure Blob File Share with ShareFileClient

[英]Write a file to Azure Blob File Share line by line with ShareFileClient in C# Azure Function

我想在 Azure Blob 文件共享中逐步上传/创建一个文件,因为我不知道要写入的数据总量(逐行从数据库读取):

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

问题是:如果我创建文件(或想用 overwrite=true 写入它),我必须将 state 设为 maxLength - 我不知道。

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 文件共享吗?

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 第二个参数是“开始写入的 blob 中的偏移量”。 不是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 通话的成本。

说:

  • 您的数据库中有 1M(M=百万)行
  • 你写的每一行是 2KB

使用您的代码,您将支付1,000,000/10,000 * 2 * 0.065 = $13 当您每天和每个月的每一天都这样做几次时,这些就会加起来。 (每行 2 次调用: write() + close()可能调用flush REST API)

相反,如果您每次写入100行,则需要支付$0.13

实际数量会因地区/等级等而异,但规模保持不变。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM