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.
Load Balancing ist in Ordnung. Das Problem tritt auf, wenn die Remote-Mitarbeiter mit der Verarbeitung von Jobs beginnen. – nate
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
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