gpt4 book ai didi

azure - 并行上传 blob 时出现 "The specified block list is invalid"

转载 作者:行者123 更新时间:2023-12-02 01:17:43 26 4
gpt4 key购买 nike

我有一个(相当大的)Azure 应用程序,它可以将(相当大的)文件并行上传到 Azure Blob 存储。

在百分之几的上传中,我遇到了异常:

指定的阻止列表无效。

System.Net.WebException:远程服务器返回错误:(400) 错误请求。

这是我们运行一段看起来相当无害的代码来并行上传 blob 到 Azure 存储的情况:

    public static void UploadBlobBlocksInParallel(this CloudBlockBlob blob, FileInfo file) 
{
blob.DeleteIfExists();
blob.Properties.ContentType = file.GetContentType();
blob.Metadata["Extension"] = file.Extension;

byte[] data = File.ReadAllBytes(file.FullName);

int numberOfBlocks = (data.Length / BlockLength) + 1;
string[] blockIds = new string[numberOfBlocks];

Parallel.For(
0,
numberOfBlocks,
x =>
{
string blockId = Convert.ToBase64String(Guid.NewGuid().ToByteArray());
int currentLength = Math.Min(BlockLength, data.Length - (x * BlockLength));

using (var memStream = new MemoryStream(data, x * BlockLength, currentLength))
{
var blockData = memStream.ToArray();
var md5Check = System.Security.Cryptography.MD5.Create();
var md5Hash = md5Check.ComputeHash(blockData, 0, blockData.Length);

blob.PutBlock(blockId, memStream, Convert.ToBase64String(md5Hash));
}

blockIds[x] = blockId;
});

byte[] fileHash = _md5Check.ComputeHash(data, 0, data.Length);
blob.Metadata["Checksum"] = BitConverter.ToString(fileHash).Replace("-", string.Empty);
blob.Properties.ContentMD5 = Convert.ToBase64String(fileHash);

data = null;
blob.PutBlockList(blockIds);
blob.SetMetadata();
blob.SetProperties();
}

一切都很神秘;我认为我们用来计算阻止列表的算法应该生成长度相同的字符串...

最佳答案

我们遇到了类似的问题,但是我们没有指定任何 block ID,甚至没有在任何地方使用 block ID。在我们的例子中,我们使用:

using (CloudBlobStream stream = blob.OpenWrite(condition))
{
//// [write data to stream]

stream.Flush();
stream.Commit();
}

这会导致并行加载下出现指定的 block 列表无效。错误。切换此代码以使用 UploadFromStream(…)将数据缓冲到内存中时的方法修复了问题:

using (MemoryStream stream = new MemoryStream())
{
//// [write data to stream]

stream.Seek(0, SeekOrigin.Begin);
blob.UploadFromStream(stream, condition);
}

显然,如果太多数据缓冲到内存中,这可能会产生负面的内存影响,但这是一种简化。需要注意的一件事是,UploadFromStream(...) 在某些情况下使用 Commit(),但会检查其他条件以确定要使用的最佳方法。

关于azure - 并行上传 blob 时出现 "The specified block list is invalid",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12917857/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com