Rで解析:データサイズを小さく保存、素早く読み込み「fst」パッケージ

Rの解析に役に立つ記事

データを小さく保存するだけでなく、取り込みも素早いファイル形式で保存が可能なパッケージの紹介です。大変便利だと思います。

なお、実行コマンドを実行する際はデータ例の作成のnを小さくしないと大変時間がかかります。そのまま実行するのはオススメしません。注意してください。

パッケージバージョンは0.9.4。パッケージのバージョンは0.4.0。実行コマンドはwindows 11のR version 4.1.2で確認しています。

スポンサーリンク
スポンサーリンク

パッケージのインストール

下記コマンドを実行してください。

#パッケージのインストール
install.packages("fst")

実行コマンド

詳細はコマンド、パッケージのヘルプを確認してください。

パッケージの読み込み
library("fst")

###データ例の作成#####
n <- 5000000
TestData <- data.frame("Group" = sample(paste0("Group", 1:3), n, replace = TRUE),
                       "Data1" = sample(rnorm(10), n, replace = TRUE),
                       "Data2" = sample(LETTERS[1:10], n, replace = TRUE),
                       "Data3" = sample(rnorm(10), n, replace = TRUE))
########

###ファイルの保存場所を指定#####
library("tcltk")
setwd(paste(as.character(tkchooseDirectory(title = "ファイルの保存場所を選択"),
                         sep = "", collapse ="")))
########

###以下コマンドの説明です#####
#fstファイルで保存:write.fstコマンド
#圧縮率を設定:compressオプション;0-100の範囲
#write.fst(x = "オブジェクトを指定", "Test.fst", compress = 0)
#fstファイルの読込み:write.fstコマンド
#対象ファイルの保存場所を指定:pathオプション
#結果をdata.table classにする:as.data.tableオプション;初期値:FALSE
#read.fst(path = "ファイルパス", columns = NULL, from = 1, to = NULL,
#         as.data.table = FALSE)
########

###参考:TestDataオブジェクト,エクセルファイル,fstファイルのサイズ比較#####
#TestDataオブジェクトのサイズ
print(object.size(TestData), units = "b")
160001816 bytes

#エクセルファイルで出力した場合のサイズ
#openxlsxパッケージを利用した場合
#install.packages("openxlsx")
library("openxlsx")
write.xlsx(TestData, file = "Test.xlsx", sheetName = "TestData")
#確認;結果はbytes
file.size(file.choose())
[1] 81409417

#write.fstコマンドで出力した場合のサイズ
#compress = 0の場合
file.info(file.choose())[, 1]
[1] 90000284
#compress = 100の場合
#オリジナルの約1/10のサイズ
file.info(file.choose(), compress = 100)[, 1]
[1] 11827144
########

###参考:エクセルファイル,fstファイルの読込み時間比較#####
#エクセルファイルでの読込み時間
#openxlsxパッケージを利用した場合
library("tcltk")
library("openxlsx")
#xlsxファイルファイルを選択
XLPath <- paste0(as.character(tkgetOpenFile(title = "エクセルファイルを選択",
                                            filetypes = '{"エクセルファイル" {"*.*"}}',
                                            initialfile = c("*.*"))), collapse = " ")
#xlsxファイルの読み込み:read.xlsxコマンド
#読み込むシートを指定:sheetオプション
system.time(XLData <- read.xlsx(XLPath, sheet = 1))
ユーザ   システム       経過  
77.57       6.74      84.63 

#fstファイルの読み込み
FSTPath <- paste0(as.character(tkgetOpenFile(title = "fstファイルを選択",
                                             filetypes = '{"fstファイル" {"*.*"}}',
                                             initialfile = c("*.*"))), collapse = " ")
#compress = 0の場合
system.time(FSTData <- read.fst(path = FSTPath, columns = NULL,
                                from = 1, to = NULL,
                                as.data.table = FALSE))
ユーザ   システム       経過  
0.02       0.02       0.03
#compress = 100の場合
ユーザ   システム       経過  
0.14       0.00       0.14 

#compress = 0の場合で同等性の確認
identical(all.equal(TestData, FSTData), TRUE)
[1] TRUE

参考:作業した環境

なお、ディスクドライブはSamsung SSD 750 EVOを使用しています。


あなたの解析がとっても楽になりますように!!

タイトルとURLをコピーしました