2012-07-31 2 views
1

푸른 하늘 방울 저장소에 시험 사용 계정이 있습니다. 내 로컬 컴퓨터에서 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가 클러스터형 인덱스를 작성하려고 시도했기 때문일 수 있습니다. 속도를 높이려면 어떻게해야합니까? 문제가 무엇입니까?

+0

'GetFiles'는 문자열을 반환합니다. 맞습니까? 그러나'StoreFile'은 스트림을 취합니다 ... 나는 무엇을 놓치고 있습니까? (당신이 스트림을 처분하는 곳이 궁금합니다. 뭔가가 새어 나올 수도 있습니다.) for (int i = 0; i <100000; i ++) {container.GetBlobReference (Guid.NewGuid(). ToString()). UploadText (i.ToString()); }'측정을 단순화하기 위해. – smarx

+0

나는 memleaks 또는 처분이 업로드 속도에 영향을 미치지 않는다고 생각합니다. 스트림은 File.OpenRead (파일 이름) – brainstream

+0

을 호출하여 만들어지며 해당 스트림이 제대로 처리 되었습니까? – smarx

답변

2

많은 작은 파일을 업로드하려면 여러 스레드를 사용해야합니다. 예를 들어 BeginUploadFromStream 또는 Parallel.ForEach을 사용할 수 있습니다.

+0

왜 처음 10000 개의 파일이 빨리 업로드 되었습니까? – brainstream

+0

프로파일 러를 사용하여 병목 현상을 찾습니다. 그것은 당신의 로그 일 것입니다 : writer.WriteLine ("{0} = {1}", id, file); 또한 최신 SDK를 사용하고 있습니까? – Guillaume

+0

조언 해 주셔서 감사합니다. 나는 로컬 파일 저장을 사용해 보았고 ~ 20 분 후에 글을 썼다. 그래서 문제는 제 코드에 없습니다. 예, 최신 SDK를 사용하고 있습니다. – brainstream

1

당신의 코드에서 알아 차 렸던 점은 StoreBile 컨테이너에서 CreateIfNotExist() 함수를 호출하는 StoreFile() 함수에서 GetBlob() 함수를 호출한다는 것입니다. 이 함수는 또한 저장 서비스를 호출하므로 업로드 프로세스에 지연이 추가됩니다 (이 함수를 호출 할 때마다 저장 트랜잭션에 대해 요금이 부과되지 않음).

blob 업로드를 시작하기 전에이 함수를 한 번만 호출하는 것이 좋습니다.

+0

첫 번째 10000 개의 파일에 대해 CreateIfNotExist()가 어떤 역할도 수행하지 않았습니다. – brainstream

관련 문제