2016-04-25 6 views
-2

Ich habe den folgenden Algorithmus, der Daten zu Azure Blob SpeicherWas ist die optimale Anzahl von laufenden Aufgaben?

private const long MaxChunkSize = 1024 * 1024 * 4; // 4MB 

private void UploadPagedDataToBlob(...) 
{ 
    ... 
    List<Task> list_of_tasks = new List<Task>(); 
    do 
    { 
     var stream = new MemoryStream(data, index, (int)blockSize); 
     var task = _blob.WritePagesAsync(stream, startPosition, null); 

     list_of_tasks.Add(task); 
     ... 
    } 
    while (remainingDataLength > 0); 
    Task.WaitAll(list_of_tasks.ToArray()); 
} 

Wenn meine Dateigröße hat 628MB => dann list_of_tasks hat 157 Aufgaben (628/MaxChunkSize) schreiben. Normalerweise habe ich mehr als 1 TB Datei. Ich möchte nicht so viele laufende Aufgaben haben, wie kann ich effizientere Algorithmen erstellen? Was ist die optimale Anzahl von laufenden Aufgaben? Zum Beispiel nicht mehr als 200, irgendwelche Empfehlungen?

+0

Kommt drauf an. Ein entferntes System kann Verbindungen auf einer einzelnen CPU begrenzen, die Sie möglicherweise auf Kerne beschränken möchten, wenn es an die CPU gebunden ist. Wir wissen nicht, was "_blob" ist, also ist es schwer zu beantworten. Im Allgemeinen ist es besser, Parallel.For oder TPL DataFlow zu verwenden und TPL zu entscheiden, wie viele Aufgaben gleichzeitig ausgeführt werden sollen. –

+0

Ich habe vor einiger Zeit eine ähnliche Frage beantwortet. Es kann hilfreich sein: http://stackoverflow.com/a/32252521/1835769 – displayName

+4

Sie sind derjenige, der das Experiment durchführen kann, um die optimale Anzahl von Aufgaben für Ihr Szenario zu bestimmen, nicht wir. Entwerfe ein Experiment, führe es sorgfältig aus und du wirst die Antwort wissen. –

Antwort

1

Zum sequentiellen Schreiben von Dateien auf die gleiche Festplatte?

1.

Parallelism ist nur dann sinnvoll, wenn Sie tatsächlich die Aufgaben parallel ausführen können. Ihr gemeinsamer Flaschenhals ist der Festplattenzugriff, und das wird nicht besser, wenn Sie mehrere Schreibvorgänge gleichzeitig ausführen - es kann viel langsamer werden und es wird tendenziell um Prioritäten mit anderen Dingen kämpfen, die auf demselben System ausgeführt werden .

Festplatten sind für sequenzielles Schreiben ziemlich gut optimiert. Wenn Sie Probleme mit dem Durchsatz haben, machen Sie einfach Ihre Stücke größer - aber parallel dazu zu schreiben, wird Ihnen wahrscheinlich eher schaden als helfen.

Wenn Sie mit Remote-Ressourcen arbeiten, müssen Sie die Latenz berücksichtigen. Wenn die Latenz viel höher ist als die Zeit, die zum Senden eines Chunks benötigt wird, kann es sinnvoll sein, Parallelisierung zu verwenden, um "verschwendete" Zeit zu reduzieren. Sie müssen jedoch auch sicherstellen, dass alles ordnungsgemäß synchronisiert ist und keine Drosselung auftritt.

+1

Nicht sicher, wie dies eine akzeptierte Antwort ist, da die Frage nicht zum Schreiben auf die Festplatte geht. Es geht darum, in Azure-Blobspeicher zu schreiben. Genauer gesagt zu einem Seiten-Blob (vorausgesetzt, der Code hat einen Aufruf an 'WritePagesAsync()'). Azure Blob Storage ist für mehrere gleichzeitige Schreibvorgänge ausgelegt und nicht wie eine Festplatte optimiert. Wenn das OP versucht, gleichzeitig in mehrere Blobs zu schreiben, wird es durch pro-Blob-Transaktionen und pro Speicherkonto-Transaktionen pro Sekunde (plus Bandbreite) begrenzt. –

+0

Danke, aber ich schreibe auf einen Blob mit Offset asynchron. Wie viele Aufgaben kann ich erstellen? – Anatoly

+0

@Anatoly Das ist der "Remote Resources" -Teil meiner Antwort - finde die Latenz heraus, schau, ob es irgendwelche Invasionen gibt und probiere schließlich einfach verschiedene Konfigurationen aus und wähle die Besten. – Luaan

Verwandte Themen