Laufzeitoptimierung von Schreibzugriffen möglich?

For(), If(), While() und Verwandte. Diskussion von programmiertechnischen Fragen.

Laufzeitoptimierung von Schreibzugriffen möglich?

Beitragvon Laiki » Do 3. Okt 2013, 19:36

Hallo,

ich bin recht neu in der 'R' Welt, und habe festgestellt, dass diese Sprache konzeptionell für die Verarbeitung von großen Datenmengen ausgelegt zu sein scheint.
Mir ist aber aufgefallen, dass indexbasierte Schreibzugriffe extrem langsam sind:(
Zum verdeutlichen habe ich lese und Schreibzugriffe auf eine Datenmenge von 100.000 Elementen verglichen.
Schreiben dauert fast 200 mal länger als lesen :?:
Code: Alles auswählen
a <- 100000:1
x <- as.data.frame(cbind(a))
x[["b"]] <- NA

r <- function(){
  for( i in 1:100000 ){
      tmp <- m[["a"]]
  } 
}

w <- function(){
  for( i in 1:100000 ){
    m[["b"]] <- i
  } 
}
system.time(r())
system.time(w())

Liefert
Code: Alles auswählen
> system.time(r())
       User      System verstrichen
       2.29        0.00        2.31
> system.time(w())
       User      System verstrichen
     430.86       26.41      473.77


Mache ich etwas falsch?
Gibt es effizientere Datentypen?

Was ich eigentlich vorhabe ist, eine aus einer Datei eingelesenen Tabelle um Spalten zu erweitern. Diese Spalten werden Werte beinhalten, die zu berechnen sind, und müssen daher indiziert geschrieben werden. Ist die Tabelle dann soweit fertig, wird sie wieder in eine Datei geschrieben.
Da die Datensätze recht groß sind, bin ich natürlich an einer Laufzeitoptimierung interessiert.

Gruß
Laiki
Laiki
 
Beiträge: 2
Registriert: Do 3. Okt 2013, 19:05
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Laufzeitoptimierung von Schreibzugriffen möglich?

Beitragvon Laiki » Mo 4. Nov 2013, 18:45

Hallo,

der code den ich gepostet habe beinhaltete einen Fehler, daher war er nicht verwendbar um selbst die Zeiten zu messesn.
Mittlerweile habe ich festgestellt, dass es performanter ist, Daten in eine Datei zu schreiben und diese per read.table zurück zu lesen amstatt data.frame objekte per Indizierung zu ändern.
Das Ergebnis ist zeigt, dass es sich lohnt diesen Umweg zu gehen:
Code: Alles auswählen
system.time(r())
   user  system elapsed
   2.57    0.00    2.42
> system.time(w())
   user  system elapsed
713.50   37.85  750.25
> system.time(ww())
   user  system elapsed
   4.77    8.36   12.04
>


Hier der verwendete code
Code: Alles auswählen
a <- 100000:1
x <- as.data.frame(cbind(a))
x[["b"]] <- NA


r <- function(){
  for( i in 1:100000 ){
    tmp <- x[["a"]]
  } 
}

w <- function(){
  for( i in 1:100000 ){
    x[["b"]] <- i
  } 
}

ww <- function(){
  tmpFileName="c:/temp/tmpdata.txt"
  con <- file(tmpFileName, open="w+")
  for( i in 1:100000 ){
    cat( x$a[i], i, "\n", sep=";", file = con )
  }
  close(con)

  x <- read.table(  file=tmpFileName
                  , header=FALSE, na.strings="NA", dec=".", strip.white=TRUE,
                  , col.names = c("a", "b", "unused")
                  , sep=";" )
}

system.time(r())
system.time(w())
system.time(ww())
Laiki
 
Beiträge: 2
Registriert: Do 3. Okt 2013, 19:05
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Laufzeitoptimierung von Schreibzugriffen möglich?

Beitragvon druss » Fr 3. Jan 2014, 15:18

Hallo,

Schleifen sind bei großen Datenmengen generell immer zu vermeiden.
Es gibt jedoch Datentypen die deutlich "schneller" sind:

Code: Alles auswählen
a <- 100000:1
x <- as.data.frame(cbind(a))
x[["b"]] <- NA

library(data.table)
x <- as.data.table(x)

system.time(x[,new:=a-1, by="a"])

> system.time(x[,new:=a-1, by="a"])
   user  system elapsed
   0.05    0.00    0.05


by = "a" bewikt, dass eR jede Zeile einzeln schreibt, da der data.table x bzgl. der Spalte a unique ist.

LG
druss
 
Beiträge: 25
Registriert: Sa 1. Okt 2011, 17:21
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post


Zurück zu Programmierkonzepte

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron