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

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



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



  1. utils



    read.csv



    は、RでCSVファイルを読み取る標準的な方法です。
  2. read_csv



    readr



    で以前のメソッドを置き換えました
  3. readRDS



    からのload



    readRDS



  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



形式に加えて、 feather



RDS



および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



形式からの読み取りに関しては、 fread



read_csv



およびread.csv



よりも大幅に優れているため、 csv



ファイルからの読み取りに最適なオプションです。



この場合、 csv



からこの形式への変換は使い捨てであり、ファイルサイズに厳密な制限はなかったため、 feather



ファイルを使用することにしRData



。したがって、 RData



またはRData



は考慮しませんでした。



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



  1. fread



    を使用して顧客から提供されたcsv



    ファイルを読み取り、
  2. write_feather



    を介してこのファイルをfeather



    書き込みます。
  3. read_feather



    を使用して、アプリケーションの起動時にfeather



    ファイルをロードします。


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



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



All Articles