ファイルからRへの高速ロードデータ

最近、Shinyでアプリケーションを作成しました。このアプリケーションでは、非常に大きなデータブロック(データフレーム)を使用する必要がありました。 これはアプリケーションの起動時間に直接影響したため、Rのファイル(この場合、これらは顧客から提供されたcsvファイル)からデータを読み取り、最適なものを決定するいくつかの方法を検討する必要がありました。

この投稿の目的は以下を比較することです:

  1. utils read.csvは、RでCSVファイルを読み取る標準的な方法です。
  2. read_csv readrで以前のメソッドを置き換えました
  3. readRDSからのloadreadRDS
  4. read_feather fread

データ


まず、いくつかのランダムデータを生成します。

 set.seed(123) df <- data.frame(replicate(10, sample(0:2000, 15 * 10^5, rep = TRUE)), replicate(10, stringi::stri_rand_strings(1000, 5))) 

ファイルをディスクに保存して、ダウンロード時間を推定します。 csv形式に加えて、 featherRDSおよびRdataも必要Rdata

 path_csv <- '../assets/data/fast_load/df.csv' path_feather <- '../assets/data/fast_load/df.feather' path_rdata <- '../assets/data/fast_load/df.RData' path_rds <- '../assets/data/fast_load/df.rds' library(feather) library(data.table) write.csv(df, file = path_csv, row.names = F) write_feather(df, path_feather) save(df, file = path_rdata) saveRDS(df, path_rds) 

次に、ファイルサイズを確認します。

 files <- c('../assets/data/fast_load/df.csv', '../assets/data/fast_load/df.feather', '../assets/data/fast_load/df.RData', '../assets/data/fast_load/df.rds') info <- file.info(files) info$size_mb <- info$size/(1024 * 1024) print(subset(info, select=c("size_mb"))) ## size_mb ## ../assets/data/fast_load/df.csv 1780.3005 ## ../assets/data/fast_load/df.feather 1145.2881 ## ../assets/data/fast_load/df.RData 285.4836 ## ../assets/data/fast_load/df.rds 285.4837 

ご覧のとおり、両方のファイル形式、 csv 、およびfeather 、より多くのディスク容量を占有します。 Csv -6倍、 feather - RDSおよびRData 4倍以上。

性能試験


10ラウンドの読み取り時間を比較するために、 microbenchmarkライブラリがmicrobenchmark 。 方法


 library(microbenchmark) benchmark <- microbenchmark(readCSV = utils::read.csv(path_csv), readrCSV = readr::read_csv(path_csv, progress = F), fread = data.table::fread(path_csv, showProgress = F), loadRdata = base::load(path_rdata), readRds = base::readRDS(path_rds), readFeather = feather::read_feather(path_feather), times = 10) print(benchmark, signif = 2) ##Unit: seconds ## expr min lq mean median uq max neval ## readCSV 200.0 200.0 211.187125 210.0 220.0 240.0 10 ## readrCSV 27.0 28.0 29.770890 29.0 32.0 33.0 10 ## fread 15.0 16.0 17.250016 17.0 17.0 22.0 10 ## loadRdata 4.4 4.7 5.018918 4.8 5.5 5.9 10 ## readRds 4.6 4.7 5.053674 5.1 5.3 5.6 10 ## readFeather 1.5 1.8 2.988021 3.4 3.6 4.1 10 

そして勝者はfeatherです! ただし、 featherを使用するには、ファイルをこの形式に予備変換する必要があります。

loadまたはreadRDSを使用すると、パフォーマンス(速度の点で2位と3位)を改善できます。小さな/圧縮ファイルを保存することも利点です。 どちらの場合も、最初にファイルを適切な形式に変換する必要があります。

csv形式からの読み取りに関しては、 freadread_csvおよびread.csvよりも大幅に優れているため、 csvファイルからの読み取りに最適なオプションです。

この場合、 csvからこの形式への変換は使い捨てであり、ファイルサイズに厳密な制限はなかったため、 featherファイルを使用することにしRData 。したがって、 RDataまたはRDataは考慮しませんでした。

アクションの最終シーケンスは次のとおりです。

  1. freadを使用して顧客から提供されたcsvファイルを読み取り、
  2. write_featherを介してこのファイルをfeather書き込みます。
  3. read_featherを使用して、アプリケーションの起動時にfeatherファイルをロードします。

最初の2つのタスクは、一度実行され、Shinyアプリケーションのコンテキスト外で実行されました。

Rでファイルを読み取るための別の興味深いパフォーマンステストがあります。残念なことに、記事で指定された関数を使用すると、文字列型のオブジェクトを取得し、最も広く頻繁に使用される文字列データを処理する前に文字列データの処理を実行する必要がありますデータフレーム

Source: https://habr.com/ru/post/J326616/


All Articles