1

Azure BLOB ストレージに試用アカウントがあります。生成された 100000 個のファイルをローカル マシンからアップロードしようとしています。操作にはすでに 17 時間以上の期間があり、〜 77000 ファイルしかアップロードされていません。シンプルな bash スクリプトで作成されたすべてのファイル:

for i in {1..100000}
do
    echo $i
    echo $i > $1\\$i.txt
done

アップロードのコード:

using(var stream = File.OpenWrite(textBoxManyUploadFileName.Text))
using(var writer = new StreamWriter(stream)) {
    foreach(var file in Directory.GetFiles(textBoxManyUploadFrom.Text)) {
        Guid id = Guid.NewGuid();
        storage.StoreFile(file, id, ((FileType)comboBoxManyUploadTypes.SelectedItem).Number);
        writer.WriteLine("{0}={1}", id, file);
    }
}

public void StoreFile(Stream stream, Guid id, string container) {
    try {
        var blob = GetBlob(id, container);
        blob.UploadFromStream(stream);
    } catch(StorageException exception) {
        throw TranslateException(exception, id, container);
    }
}

public void StoreFile(string filename, Guid id, int type = 0) {
    using(var stream = File.OpenRead(filename)) {
        StoreFile(stream, id, type);
    }
}

CloudBlob GetBlob(Guid id, string containerName) {
    var container = azureBlobClient.GetContainerReference(containerName);
    if(container.CreateIfNotExist()) {
        container.SetPermissions(new BlobContainerPermissions {
            PublicAccess = BlobContainerPublicAccessType.Container
        });
    }
    return container.GetBlobReference(id.ToString());
}

最初の 10000 個のファイルが 20 ~ 30 分でアップロードされ、その後速度が低下しました。ファイル名が GUID であり、Azure がクラスター化インデックスを構築しようとしていることが原因である可能性があると思います。スピードアップするには?何が問題ですか?

4

2 に答える 2

2

多数の小さなファイルをアップロードするには、複数のスレッドを使用する必要があります。たとえば、 BeginUploadFromStreamまたはParallel.ForEachを使用できます。

于 2012-07-31T07:34:58.930 に答える
1

あなたのコードで気付いたもう 1 つのことは、StoreFile() 関数で GetBlob() 関数を呼び出していることです。これにより、BLOB コンテナーで CreateIfNotExist() 関数が呼び出されます。この関数は Storage Service の呼び出しにもつながるため、アップロード プロセスに遅延が生じることに注意してください (この関数を呼び出すたびに、ストレージ トランザクションに対しても課金されることは言うまでもありません)。

BLOB のアップロードを開始する前に、この関数を 1 回だけ呼び出すことをお勧めします。

于 2012-07-31T07:46:15.087 に答える