Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Performance von sendData #63

Open
wahani opened this issue Mar 1, 2020 · 0 comments
Open

Performance von sendData #63

wahani opened this issue Mar 1, 2020 · 0 comments

Comments

@wahani
Copy link
Member

wahani commented Mar 1, 2020

Ich habe gerade einige Vergleiche zwischen https://github.com/INWTlab/dbrequests und dbtools angefangen. Zunächst einmal ist die Umsetzung in dbtools vergleichsweise schnell. Mir ist aber trotzdem aufgefallen, dass wir bei einem sendData und großen Datensätzen sehr viel Zeit brauchen, bis überhaupt in die CSV Datei geschrieben wird. Der Vorgang hat insgesamt ca. 6 Minuten gebraucht, ohne es genau gemessen zu haben hat es ca. 2 Minuten gedauert, bis ich den Konsolen-Output von data.table gesehen habe. Irgendetwas muss dort noch passieren. Mein Verdacht war zunächst: https://github.com/INWT/dbtools/blob/d0e19d225f3453f19ad5cb0d9d00a6e9a935ed9d/R/sendData.R#L97 weil ansonsten eigentlich nicht so viel passiert. Hier lohnt sich noch einmal ein genauerer Blick. Vermutlich würde es reichen ein paar Log-Statements zu setzen, und sich die Timings anzuschauen.

Ich habe das mit folgenden Daten getestet:

NROW <- 1000000
RPLCS <- 50

char <- function(nrow) {
  res <- matrix(sample(c(letters, LETTERS), 8 * nrow, TRUE), ncol = 8)
  apply(res, 1, paste0, collapse = "")
}
num <- function(nrow) round(abs(rnorm(nrow, sd = 10000)))
id <- function(nrow) seq(1, nrow)

df <- data.table::data.table(
  id = id(NROW),
  char1 = char(NROW),
  char2 = char(NROW),
  num1 = num(NROW),
  num2 = num(NROW)
)

df <- data.table::rbindlist(replicate(RPLCS, df, FALSE))

system.time(
  data.table::fwrite(df, "some.csv")
)

creds <- dbtools::Credentials(
  # Local Database:
  dbtools::MySQL,
  host = "0.0.0.0",
  port = 3306,
  password = "root",
  username = "root",
  dbname = "test"
)
dbtools::testConnection(creds)

system.time(
  dbtools::sendData(creds, df, "some_table", mode = "truncate")
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant