0

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

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

问题是:如果我创建文件(或想用 overwrite=true 写入)我必须说明 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 文件共享?

4

1 回答 1

0

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()可能调用flushREST API)

相反,如果您要在100每次写入时写入大块行,您将支付$0.13.

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

于 2021-01-29T21:39:49.790 回答