만약 당신이 똑똑한 사람이라면 버그의 올바른 두더지를 도울 수 있습니다.Azure Development Storage에서 블록 BLOB를 병렬로 업로드 할 때 "지정된 BLOB가 이미 존재합니다"라는 메시지가 나타납니다.
블롭 블록을 병렬로 업로드하고 있는데 이는 실제 저장 장치에 대해 실행될 때 완벽하게 정상적으로 작동하지만 dev 저장 장치에 대해서는 가끔씩 오류가 발생합니다. 기 묘하게도/아이러니 컬 한 점은 얼룩 이 이미 일 경우 오류가 표시되지 않는다는 것입니다. 나는 그것이 어떤 차이를 만들 것입니다 있는지 확인하기 위해이 스레드 What is the Behaviour of UploadFile-CloudBlockBlob?에 의해 제안하지만 여전히 오류가 발생한으로
_cloudBlobClient.ParallelOperationThreadCount = 1;
설정을 시도했습니다
var container = _cloudBlobClient.GetContainerReference(containerName);
container.CreateIfNotExist();
CloudBlockBlob blob = container.GetBlockBlobReference(blobname);
// calc number of blocks. Add 1 for remainder
var blockCount = ((int)Math.Floor((double)(length/mainBlockSize))) + 1;
var blockIds = new List<string>();
Parallel.For(0, blockCount, j =>
{
int blockSize = mainBlockSize;
// if the last block then calculate the remaining block size
if (j == blockCount - 1)
blockSize = (int)length - (mainBlockSize * (blockCount - 1));
var bytes = new byte[blockSize];
string blockId = Convert.ToBase64String(Encoding.UTF8.GetBytes(j.ToString("00000")));
lock (_mutex)
{
// these operations need to co-exist so the correct block order is maintained
blockIds.Add(blockId);
stream.Read(bytes, 0, blockSize);
}
blob.PutBlock(blockId, new MemoryStream(bytes), null);
});
// commit the blob with the list of blocks
blob.PutBlockList(blockIds);
:
여기 내 코드입니다.
Arg! 처음으로 "라이브로 작동하지만 내 컴퓨터 버그에는 작동하지 않습니다"! :)
나는 모든 저장 요청을 Fiddler와 점검 했으므로 Live와 Dev의 차이점이 없으므로 개발 저장소의 버그라고 가정합니다. 가장 좋은 방법에 대한 아이디어?
감사합니다.
다음은 msdn 포럼에 대한 토론입니다. 지금까지는 병렬화가 유효하지 않다고 제안했지만 올바르지 않다고 생각합니다. http://tinyurl.com/2arhs7p – Dave
데브 스토리지와 실제 스토리지는 서로 다른 구현 방식을 가지고 있으며 과거에는 dev 스토리지에 한계가있었습니다. 대부분의 개발을 위해 dev 저장소 사용을 중단하고 대신 직접 특수 저장소 계정을 사용합니다. 그렇게하면 올바른 방법으로 작동하는 것을 테스트하고 있음을 알 수 있습니다. 나는 당신이 똑같은 일을하는 것이 좋습니다. – Cellfish