rowwise operation mit dplyr

Ich arbeite an einem großen Datenrahmen in R von 2,3 Millionen Datensätzen, der Transaktionen von Benutzern an Standorten mit Start- und Stoppzeiten enthält. Mein Ziel ist es, einen neuen Datenrahmen zu erstellen, der die pro Benutzer / pro Standort verbundene Zeit enthält. Nennen wir dies stündlich verbunden.

Transaktion kann zwischen 8 Minuten und 48 Stunden variieren, daher beträgt der Zieldatenrahmen etwa 100 Millionen Datensätze und wächst jeden Monat.

Der Code darunter zeigt, wie der endgültige Datenrahmen entwickelt wird, obwohl der Gesamtcode viel komplexer ist. Das Ausführen des gesamten Codes dauert ca. 9 Stunden auf einer Intel (R) Xeon (R) -CPU E5-2630 v3 bei 2,40 GHz und 16 Kernen und 128 GB RAM.

library(dplyr)

numsessions<-1000000
startdate <-as.POSIXlt(runif(numsessions,1,365*60*60)*24,origin="2015-1-1")

df.Sessions<-data.frame(userID = round(runif(numsessions,1,500)),
           postalcode = round(runif(numsessions,1,100)),
           daynr = format(startdate,"%w"),
              start =startdate ,
              end=   startdate + runif(1,1,60*60*10)
           )


dfhourly.connected <-df.Sessions %>% rowwise %>% do(data.frame(userID=.$userID,
                                          hourlydate=as.Date(seq(.$start,.$end,by=60*60)),
                                          hournr=format(seq(.$start,.$end,by=60*60),"%H")
                                          )
                               )

Wir möchten diesen Vorgang auf (einige) der 16 Kerne parallelisieren, um den Vorgang zu beschleunigen. Ein erster Versuch war die Verwendung desmultidplyr package. Die Partition basiert aufdaynr

df.hourlyconnected<-df.Sessions %>% 
                      partition(daynr,cluster=init_cluster(6)) %>%
                      rowwise %>% do(data.frame(userID=.$userID,
                            hourlydate=as.Date(seq(.$start,.$end,by=60*60)),
                            hournr=format(seq(.$start,.$end,by=60*60),"%H")
                              )
                            ) %>% collect()

Jetzt dierowwiseie @ -Funktion scheint einen Datenrahmen als Eingabe anstelle einer Partition zu erfordern.

Meine Fragen sind

Gibt es eine Problemumgehung, um eine zeilenweise Berechnung für Partitionen pro Kern durchzuführen?

Hat jemand einen Vorschlag, diese Berechnung mit einem anderen R-Paket und anderen Methoden durchzuführen?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage