8

ある時点で大量の小さな BLOB を単一のコンテナー (1K BLOB を超え、それぞれ 1 Mb 未満) にアップロード (ダウンロード) する必要がある Azure アプリケーションを開発しています。このプロセスを高速化するために、BLOB のアップロード (ダウンロード) に複数のスレッドを使用したいと考えています。

これは、単一のブロブをアップロードするために使用するルーチンです。

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConnectionString);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer blobContainer = 
    blobClient.GetContainerReference(ContainerName);
blobContainer.CreateIfNotExist();

CloudBlob blob = blobContainer.GetBlobReference(Id);
blob.UploadByteArray(Data);

上記のコードで使用されている各タイプについて、MSDN は次のように述べています。

この型の public static (Visual Basic では共有) メンバーはすべて、スレッド セーフです。インスタンス メンバーは、スレッド セーフであるとは限りません。

すべてのスレッドで次のコードを実行する必要があるということですか? それとも、一度だけ実行して、異なるスレッド間で CloudBlobContainer の単一のインスタンスを共有することはできますか?

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConnectionString);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer blobContainer = 
    blobClient.GetContainerReference(ContainerName);

異なるスレッドで CloudBlobContainer の単一のインスタンスを使用できれば幸いです。そうしないと、アップロード (ダウンロード) プロセス全体が大幅に遅くなります。

4

1 に答える 1

9

コンテナー自体で更新を実行しようとしない限り、単一のBLOBコンテナー参照をうまく共有する必要があります(それでも、Listなどのほとんどのシナリオでは問題ないと思います)。実際、コンテナ参照が存在することが確実な場合は、実際にはコンテナ参照も必要ありません。

client.GetContainerReference("foo").GetBlobReference("bar");
client.GetBlobReference("foo/bar");  //same

ご覧のとおり、コンテナ参照を取得する唯一の理由は、コンテナ自体に対して操作(リスト、削除など)を実行する場合です。ブロブ参照を別々のスレッドに保持する場合は、問題ありません。

于 2011-08-02T17:38:14.453 に答える