Лучший тип файла для загрузки данных в R (по скорости)? - PullRequest
1 голос
/ 04 ноября 2019

Я провожу некоторый анализ, где я получаю довольно много наборов данных, которые находятся между 2-3G. Прямо сейчас я сохраняю это как .RData типы файлов. Затем, позже, я загружаю эти файлы, чтобы продолжить работу, а загрузка занимает некоторое время. Мой вопрос: будет ли сохранение, а затем загрузка этих файлов, так как .csv будет быстрее. data.table - самый быстрый пакет для чтения в файлах .csv? Я думаю, я ищу оптимальный рабочий процесс в R.

Ответы [ 2 ]

2 голосов
/ 05 ноября 2019

На основе комментариев и некоторых моих собственных исследований я собрал эталонный тест.

library(bench)

nr_of_rows <- 1e7
set.seed(1)
df <- data.frame(
  Logical = sample(c(TRUE, FALSE, NA), prob = c(0.85, 0.1, 0.05), nr_of_rows, replace = TRUE),
  Integer = sample(1L:100L, nr_of_rows, replace = TRUE),
  Real = sample(sample(1:10000, 20) / 100, nr_of_rows, replace = TRUE),
  Factor = as.factor(sample(labels(UScitiesD), nr_of_rows, replace = TRUE))
)

baseRDS <- function() {
  saveRDS(df, "dataset.Rds")
  readRDS("dataset.Rds")
}

baseRDS_nocompress <- function() {
  saveRDS(df, "dataset.Rds", compress = FALSE)
  readRDS("dataset.Rds")
}

baseRData <- function() {
  save(list = "df", file = "dataset.Rdata")
  load("dataset.Rdata")
  df
}

data.table <- function() {
  data.table::fwrite(df, "dataset.csv")
  data.table::fread("dataset.csv")
}

feather <- function(variables) {
  feather::write_feather(df, "dataset.feather")
  as.data.frame(feather::read_feather("dataset.feather"))
}

fst <- function() {
  fst::write.fst(df, "dataset.fst")
  fst::read.fst("dataset.fst")
}

fst <- function() {
  fst::write.fst(df, "dataset.fst")
  fst::read.fst("dataset.fst")
}

# only works on Unix systems
# fastSave <- function() {
#   fastSave::save.pigz(df, file = "dataset.RData", n.cores = 4)
#   fastSave::load.pigz("dataset.RData")
# }

results <- mark(
  baseRDS(),
  baseRDS_nocompress(),
  baseRData(),
  data.table(),
  feather(),
  fst(),
  check = FALSE
)

Результаты

summary(results)
# A tibble: 6 x 13
  expression                min   median `itr/sec` mem_alloc
  <bch:expr>           <bch:tm> <bch:tm>     <dbl> <bch:byt>
1 baseRDS()              15.74s   15.74s    0.0635     191MB
2 baseRDS_nocompress() 720.82ms 720.82ms    1.39       191MB
3 baseRData()            18.14s   18.14s    0.0551     191MB
4 data.table()            4.43s    4.43s    0.226      297MB
5 feather()            794.13ms 794.13ms    1.26       191MB
6 fst()                233.96ms 304.28ms    3.29       229MB
# ... with 8 more variables: `gc/sec` <dbl>, n_itr <int>,
#   n_gc <dbl>, total_time <bch:tm>, result <list>,
#   memory <list>, time <list>, gc <list>

> summary(results,  relative = TRUE)
# A tibble: 6 x 13
  expression             min median `itr/sec` mem_alloc
  <bch:expr>           <dbl>  <dbl>     <dbl>     <dbl>
1 baseRDS()            67.3   51.7       1.15      1.00
2 baseRDS_nocompress()  3.08   2.37     25.2       1.00
3 baseRData()          77.5   59.6       1         1.00
4 data.table()         18.9   14.5       4.10      1.56
5 feather()             3.39   2.61     22.8       1   
6 fst()                 1      1        59.6       1.20
# ... with 8 more variables: `gc/sec` <dbl>, n_itr <int>,
#   n_gc <dbl>, total_time <bch:tm>, result <list>,
#   memory <list>, time <list>, gc <list>

Исходя из этого, пакет fst представляет собойбыстрый. За ним следует база R на втором месте с опцией compress = FALSE. Это производит большие файлы, хотя. Я не рекомендовал бы сохранять что-либо в csv, за исключением того, что вы хотите открыть его с помощью другой программы. В этом случае data.table будет вашим выбором. В противном случае я бы порекомендовал saveRDS или fst.

0 голосов
/ 04 ноября 2019

Если вы ищете скорость для чтения CSV, упомянутый пакет vroom является хорошим вариантом.

.RData может быть медленным, но, в отличие от CSV, TSV и еще чего-то, у него есть преимущество, которое он можетсохранить любой R тип данных: не только табличные данные (обычно кадры данных), но также списки, функции, объекты R6 и т. д. Если вам нужно сохранить только один кадр данных, RDS быстреедля записи (saveRDS) и загрузки (readRDS), чем .RData.

Вы также можете взглянуть на новый формат данных Feather , разработанный Хэдли Уикхем и Уэсом МакКинни.

Предупреждение для Feather:

Для чего не следует использовать перо?

Перо непредназначен для долгосрочного хранения данных. В настоящее время мы не гарантируем, что формат файла будет стабильным между версиями. Вместо этого используйте Feather для быстрого обмена данными между кодами Python и R или для кратковременного хранения фреймов данных в рамках некоторого анализа.

(ссылка - объявление 2016-03-29. . возможно сейчас стабильно)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...