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))
########

###&#12501;&#12449;&#12452;&#12523;&#12398;&#20445;&#23384;&#22580;&#25152;&#12434;&#25351;&#23450;#####
library("tcltk")
setwd(paste(as.character(tkchooseDirectory(title = "&#12501;&#12449;&#12452;&#12523;&#12398;&#20445;&#23384;&#22580;&#25152;&#12434;&#36984;&#25246;"),
                         sep = "", collapse ="")))
########

###&#20197;&#19979;&#12467;&#12510;&#12531;&#12489;&#12398;&#35500;&#26126;&#12391;&#12377;#####
#fst&#12501;&#12449;&#12452;&#12523;&#12391;&#20445;&#23384;:write.fst&#12467;&#12510;&#12531;&#12489;
#&#22311;&#32302;&#29575;&#12434;&#35373;&#23450;:compress&#12458;&#12503;&#12471;&#12519;&#12531;;0-100&#12398;&#31684;&#22258;
#write.fst(x = "&#12458;&#12502;&#12472;&#12455;&#12463;&#12488;&#12434;&#25351;&#23450;", "Test.fst", compress = 0)
#fst&#12501;&#12449;&#12452;&#12523;&#12398;&#35501;&#36796;&#12415;:write.fst&#12467;&#12510;&#12531;&#12489;
#&#23550;&#35937;&#12501;&#12449;&#12452;&#12523;&#12398;&#20445;&#23384;&#22580;&#25152;&#12434;&#25351;&#23450;:path&#12458;&#12503;&#12471;&#12519;&#12531;
#&#32080;&#26524;&#12434;data.table class&#12395;&#12377;&#12427;:as.data.table&#12458;&#12503;&#12471;&#12519;&#12531;;&#21021;&#26399;&#20516;:FALSE
#read.fst(path = "&#12501;&#12449;&#12452;&#12523;&#12497;&#12473;", columns = NULL, from = 1, to = NULL,
#         as.data.table = FALSE)
########

###&#21442;&#32771;:TestData&#12458;&#12502;&#12472;&#12455;&#12463;&#12488;,&#12456;&#12463;&#12475;&#12523;&#12501;&#12449;&#12452;&#12523;,fst&#12501;&#12449;&#12452;&#12523;&#12398;&#12469;&#12452;&#12474;&#27604;&#36611;#####
#TestData&#12458;&#12502;&#12472;&#12455;&#12463;&#12488;&#12398;&#12469;&#12452;&#12474;
print(object.size(TestData), units = "b")
160001816 bytes

#&#12456;&#12463;&#12475;&#12523;&#12501;&#12449;&#12452;&#12523;&#12391;&#20986;&#21147;&#12375;&#12383;&#22580;&#21512;&#12398;&#12469;&#12452;&#12474;
#openxlsx&#12497;&#12483;&#12465;&#12540;&#12472;&#12434;&#21033;&#29992;&#12375;&#12383;&#22580;&#21512;
#install.packages("openxlsx")
library("openxlsx")
write.xlsx(TestData, file = "Test.xlsx", sheetName = "TestData")
#&#30906;&#35469;;&#32080;&#26524;&#12399;bytes
file.size(file.choose())
[1] 81409417

#write.fst&#12467;&#12510;&#12531;&#12489;&#12391;&#20986;&#21147;&#12375;&#12383;&#22580;&#21512;&#12398;&#12469;&#12452;&#12474;
#compress = 0&#12398;&#22580;&#21512;
file.info(file.choose())[, 1]
[1] 90000284
#compress = 100&#12398;&#22580;&#21512;
#&#12458;&#12522;&#12472;&#12490;&#12523;&#12398;&#32004;1/10&#12398;&#12469;&#12452;&#12474;
file.info(file.choose(), compress = 100)[, 1]
[1] 11827144
########

###&#21442;&#32771;:&#12456;&#12463;&#12475;&#12523;&#12501;&#12449;&#12452;&#12523;,fst&#12501;&#12449;&#12452;&#12523;&#12398;&#35501;&#36796;&#12415;&#26178;&#38291;&#27604;&#36611;#####
#&#12456;&#12463;&#12475;&#12523;&#12501;&#12449;&#12452;&#12523;&#12391;&#12398;&#35501;&#36796;&#12415;&#26178;&#38291;
#openxlsx&#12497;&#12483;&#12465;&#12540;&#12472;&#12434;&#21033;&#29992;&#12375;&#12383;&#22580;&#21512;
library("tcltk")
library("openxlsx")
#xlsx&#12501;&#12449;&#12452;&#12523;&#12501;&#12449;&#12452;&#12523;&#12434;&#36984;&#25246;
XLPath <- paste0(as.character(tkgetOpenFile(title = "&#12456;&#12463;&#12475;&#12523;&#12501;&#12449;&#12452;&#12523;&#12434;&#36984;&#25246;",
                                            filetypes = '{"&#12456;&#12463;&#12475;&#12523;&#12501;&#12449;&#12452;&#12523;" {"*.*"}}',
                                            initialfile = c("*.*"))), collapse = " ")
#xlsx&#12501;&#12449;&#12452;&#12523;&#12398;&#35501;&#12415;&#36796;&#12415;:read.xlsx&#12467;&#12510;&#12531;&#12489;
#&#35501;&#12415;&#36796;&#12416;&#12471;&#12540;&#12488;&#12434;&#25351;&#23450;:sheet&#12458;&#12503;&#12471;&#12519;&#12531;
system.time(XLData <- read.xlsx(XLPath, sheet = 1))
&#12518;&#12540;&#12470;   &#12471;&#12473;&#12486;&#12512;       &#32076;&#36942;  
77.57       6.74      84.63 

#fst&#12501;&#12449;&#12452;&#12523;&#12398;&#35501;&#12415;&#36796;&#12415;
FSTPath <- paste0(as.character(tkgetOpenFile(title = "fst&#12501;&#12449;&#12452;&#12523;&#12434;&#36984;&#25246;",
                                             filetypes = '{"fst&#12501;&#12449;&#12452;&#12523;" {"*.*"}}',
                                             initialfile = c("*.*"))), collapse = " ")
#compress = 0&#12398;&#22580;&#21512;
system.time(FSTData <- read.fst(path = FSTPath, columns = NULL,
                                from = 1, to = NULL,
                                as.data.table = FALSE))
&#12518;&#12540;&#12470;   &#12471;&#12473;&#12486;&#12512;       &#32076;&#36942;  
0.02       0.02       0.03
#compress = 100&#12398;&#22580;&#21512;
&#12518;&#12540;&#12470;   &#12471;&#12473;&#12486;&#12512;       &#32076;&#36942;  
0.14       0.00       0.14 

#compress = 0&#12398;&#22580;&#21512;&#12391;&#21516;&#31561;&#24615;&#12398;&#30906;&#35469;
identical(all.equal(TestData, FSTData), TRUE)
[1] TRUE

参考:作業した環境

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


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

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