Tôi có một nơi nào đó trong khu phố có 4,2 triệu hình ảnh tôi cần chuyển từ Bắc Trung Hoa sang Tây Hoa Kỳ, như một phần của di chuyển lớn để tận dụng hỗ trợ Azure VM (những người không biết, Bắc Trung Mỹ không ủng hộ họ). Các hình ảnh này đều nằm trong một thùng chứa, được chia thành khoảng 119.000 thư mục.Di chuyển hàng triệu mặt hàng từ một tài khoản lưu trữ sang một số khác
Tôi đang sử dụng sau đây từ API Sao chép Blob:
public static void CopyBlobDirectory(
CloudBlobDirectory srcDirectory,
CloudBlobContainer destContainer)
{
// get the SAS token to use for all blobs
string blobToken = srcDirectory.Container.GetSharedAccessSignature(
new SharedAccessBlobPolicy
{
Permissions = SharedAccessBlobPermissions.Read |
SharedAccessBlobPermissions.Write,
SharedAccessExpiryTime = DateTime.UtcNow + TimeSpan.FromDays(14)
});
var srcBlobList = srcDirectory.ListBlobs(
useFlatBlobListing: true,
blobListingDetails: BlobListingDetails.None).ToList();
foreach (var src in srcBlobList)
{
var srcBlob = src as ICloudBlob;
// Create appropriate destination blob type to match the source blob
ICloudBlob destBlob;
if (srcBlob.Properties.BlobType == BlobType.BlockBlob)
destBlob = destContainer.GetBlockBlobReference(srcBlob.Name);
else
destBlob = destContainer.GetPageBlobReference(srcBlob.Name);
// copy using src blob as SAS
destBlob.BeginStartCopyFromBlob(new Uri(srcBlob.Uri.AbsoluteUri + blobToken), null, null);
}
}
Vấn đề là, đó là quá chậm. Waaaay quá chậm. Với tốc độ, nó sẽ đưa ra các lệnh để sao chép tất cả những thứ này, Nó sẽ diễn ra ở đâu đó trong khu phố bốn ngày. Tôi không thực sự chắc chắn những gì nút cổ chai là (kết nối giới hạn phía khách hàng, tỷ lệ hạn chế về kết thúc của Azure, đa luồng, vv).
Vì vậy, tôi tự hỏi tùy chọn của tôi là gì. Có cách nào để tăng tốc độ, hay tôi chỉ bị mắc kẹt với một công việc sẽ mất bốn ngày để hoàn thành?
Chỉnh sửa: Làm thế nào tôi đang phân phối các công việc sao chép tất cả mọi thứ
//set up tracing
InitTracer();
//grab a set of photos to benchmark this
var photos = PhotoHelper.GetAllPhotos().Take(500).ToList();
//account to copy from
var from = new Microsoft.WindowsAzure.Storage.Auth.StorageCredentials(
"oldAccount",
"oldAccountKey");
var fromAcct = new CloudStorageAccount(from, true);
var fromClient = fromAcct.CreateCloudBlobClient();
var fromContainer = fromClient.GetContainerReference("userphotos");
//account to copy to
var to = new Microsoft.WindowsAzure.Storage.Auth.StorageCredentials(
"newAccount",
"newAccountKey");
var toAcct = new CloudStorageAccount(to, true);
var toClient = toAcct.CreateCloudBlobClient();
Trace.WriteLine("Starting Copy: " + DateTime.UtcNow.ToString());
//enumerate sub directories, then move them to blob storage
//note: it doesn't care how high I set the Parallelism to,
//console output indicates it won't run more than five or so at a time
var plo = new ParallelOptions { MaxDegreeOfParallelism = 10 };
Parallel.ForEach(photos, plo, (info) =>
{
CloudBlobDirectory fromDir = fromContainer.GetDirectoryReference(info.BuildingId.ToString());
var toContainer = toClient.GetContainerReference(info.Id.ToString());
toContainer.CreateIfNotExists();
Trace.WriteLine(info.BuildingId + ": Starting copy, " + info.Photos.Length + " photos...");
BlobHelper.CopyBlobDirectory(fromDir, toContainer, info);
//this monitors the container, so I can restart any failed
//copies if something goes wrong
BlobHelper.MonitorCopy(toContainer);
});
Trace.WriteLine("Done: " + DateTime.UtcNow.ToString());
Bạn đang sử dụng rất nhiều chủ đề để làm điều đó? Hầu hết thời gian là trong việc sao chép. Bạn có thể song song nó rất nhiều tôi nghĩ. Có lẽ với một loạt các vai trò công nhân trên azure. –
Tôi cũng có suy nghĩ tương tự; ban đầu tôi đã chạy tất cả đồng bộ. Sau một số thử nghiệm, nó sẽ mất gần hai tuần, vì vậy tôi viết lại nó để sử dụng BeginStartCopyFromBlob(), và gói các cuộc gọi đến CopyBlobDirectory() trong một Parallel.ForEach.Tuy nhiên, khung công tác song song từ chối cho phép tôi chạy hơn 5 hoặc nhiều công việc cùng một lúc (ngay cả khi tôi đặt mức độ cao hơn); Tôi không chắc làm thế nào để buộc nó chạy nhiều hơn. – Dusda
Bạn có thể chỉ sinh ra rất nhiều chủ đề như thế này: http://stackoverflow.com/questions/5041153/how-to-create-multiple-threads-in-windows-azure-worker-role, nói 1000 cho mỗi trường hợp công nhân và sau đó quay lên vài chục vai trò công nhân? –