Ich partitioniere einen Datenrahmen mit split()
, um parLapply()
zu verwenden, um eine Funktion auf jeder Partition parallel aufzurufen. Der Datenrahmen hat 1,3 Millionen Zeilen und 20 Spalten. Ich teile/partitioniere um zwei Spalten, beide Zeichen. Sieht so aus, als gäbe es ~ 47K eindeutige IDs und ~ 12K eindeutige Codes, aber nicht jede Paarung von ID und Code ist identisch. Die resultierende Anzahl von Partitionen beträgt ~ 250K. Hier ist die split()
Linie:Schnelle Alternative zum Aufteilen in R
system.time(pop_part <- split(pop, list(pop$ID, pop$code)))
Die Partitionen werden dann in parLapply()
zugeführt werden, wie folgt:
cl <- makeCluster(detectCores())
system.time(par_pop <- parLapply(cl, pop_part, func))
stopCluster(cl)
lasse ich habe den split()
Code alleine laufen fast eine Stunde und es wird nicht abgeschlossen. Ich kann durch die ID allein teilen, die ~ 10 Minuten dauert. Darüber hinaus verbrauchen R Studio und die Worker-Threads ca. 6 GB RAM.
Der Grund, warum ich die resultierende Anzahl von Partitionen kenne, ist der entsprechende Code in Pentaho Data Integration (PDI), der in 30 Sekunden läuft (für das gesamte Programm, nicht nur für den "Split" -Code). Ich hoffe nicht auf diese Art von Leistung mit R, aber etwas, das vielleicht in 10 - 15 Minuten im schlimmsten Fall abgeschlossen wird.
Die Hauptfrage: Gibt es eine bessere Alternative zu teilen? Ich habe auch versucht ddply()
mit .parallel = TRUE
, aber es lief auch über eine Stunde und nie abgeschlossen.
Danke, ich werde es versuchen. Ha, ich habe den R-Code ursprünglich geschrieben und dann nach PDI portiert (ich habe mehr Erfahrung mit R als PDI). – argoneus
Ich habe den 'split()' Code, den du gepostet hast, ausgeführt und fast eine Stunde gewartet, aber er wurde nie beendet. – argoneus
Ein paar zusätzliche Vorschläge hinzugefügt um Split, die in der Größenordnung von einer Sekunde oder weniger dauern sollte. Vielleicht verursachen Faktoren auch, dass die Funktion langsam ist? –