2016-08-05 36 views
0

Bei der Verwendung von foreach und doRedis warten die doRedis-Worker, bis alle Jobs den Redis-Server erreicht haben, bevor sie mit der Verarbeitung beginnen. Ist es möglich, dass sie beginnen, bevor die Vorverarbeitung abgeschlossen ist?Warum beginnen meine DoRedis-Mitarbeiter nicht, bis alle Jobs auf dem Redis-Server sind

Ich benutze einen Iterator, der großartig funktioniert - die Vorverarbeitung geschieht 'just in time' und die Jobdaten beginnen den Server zu treffen, während der Iterator läuft. Dieses Verhalten kann ich jedoch nicht ausnutzen, weil die Arbeiter einfach warten, bis alle Jobs hochgeladen sind.

Beispielcode:

library(foreach) 
library(doRedis) 

registerDoRedis("worklist", "0.0.0.0") 

foreach (var = complex.iter(1:1E6)) %dopar% { 
    process.function(var) 
    } 

In diesem Beispiel complex.iter dauert eine Weile, und es gibt viele Elemente überlaufen. Daher wäre es großartig, wenn die Arbeiter process.function() starten würden, bevor die Vorverarbeitung abgeschlossen ist. Leider scheinen sie zu warten bis complex.iter auf allen Elementen ausgeführt wird.

Ich habe .inorder=F gesetzt.

Haben Sie Vorschläge, wie Sie dieses gewünschte Verhalten erreichen können? Vielen Dank.

Antwort

0

Sie können ein paar Dinge ausprobieren, um es zu ersticken. Einer setzt die Chunk-Größe und der andere ist es, lokale Arbeiter zu starten, damit Aufgaben im Hintergrund laufen.

[Hier ist ein Link zum PDF zu erklären, wie diese beiden Funktionen ordnungsgemäß verwendet werden]

startLocalWorkers & setChunkSize

Ohne weitere Informationen über die Daten, Funktionen und Aufgaben ist es schwer, Ihnen zu helfen mehr als die.

+0

Load Balancing ist in Ordnung. Das Problem tritt auf, wenn die Remote-Mitarbeiter mit der Verarbeitung von Jobs beginnen. – nate

+0

Ihre Iteration findet innerhalb einer Funktion statt (foreach erstellt eine geschlossene Umgebung). Wenn Sie die Funktion nicht dazu bringen, Daten vor dem Abschluss auszugeben, steht sie der Redis-Task nicht zur Verfügung, unabhängig davon, ob Sie parallele Kerne zugewiesen haben oder nicht. Sie müssen darüber nachdenken, wie Sie Daten in dieser Umgebung verwalten und inkrementell weitergeben, wenn Sie die Prozesse gleichzeitig ausführen möchten, oder Sie müssen das Redis-Skript in die Funktion aufnehmen, um die gleichzeitige Arbeit nach Abschluss jeder Iteration zu fördern. – sconfluentus

+0

Daten werden sofort wieder angezeigt. ZB die Chunks zum Iterieren (zB 'var' oben) und der Code zum Ausführen (zB' process.function (var) 'oben). Das ist nicht das Problem. – nate

0

Bei anderen haben die gleiche Frage:

Die Antwort derzeit keine ist, beendet der Iterator Aggregation aller Aufgabendaten vor dem Hochladen und Arbeitsplätze für die Arbeitnehmer zu verteilen. Relevante Diskussion hier: https://github.com/bwlewis/doRedis/issues/39

Ich war auch falsch in meiner Frage, in dem der Iterator abgeschlossen wurde, bevor Daten hochgeladen wurden. Dennoch führt der blockierende Upload dazu, dass die Worker nicht nur warten, bis der Iterator fertig ist, sondern auch bis der Upload abgeschlossen ist.

Ich werde die Antwort aktualisieren, wenn wir irgendwelche Änderungen implementieren.