ソリッドステートドライブに保存されたデータで r/python を使用した経験がある人はいますか? 主に読み取りを行っている場合、理論的には、これにより大規模なデータセットの読み込み時間が大幅に改善されるはずです。これが本当かどうか、データ集約型アプリケーションの IO レートを向上させるために SSD に投資する価値があるかどうかを知りたいです。
5 に答える
私の 2 セント: SSD は、データではなくアプリケーションが保存されている場合にのみ効果があります。それでも、OS のように、ディスクへの大量のアクセスが必要な場合に限ります。プロファイリングを紹介するのは正しいことです。何もしなくても、読み取り時間のほとんどすべてが処理に費やされており、ディスクの読み取りに費やされていないことはわかります。
データがどこに保存されているかではなく、データの形式について考えるほうがはるかに有益です。適切なアプリケーションと適切な形式を使用することで、データの読み取りを高速化できます。テキスト ファイルをいじる代わりに、R の内部形式を使用するように。それを感嘆符にしてください。テキスト ファイルをいじり続けることは絶対にやめてください。速度が必要な場合は、バイナリに進みます。
オーバーヘッドがあるため、通常、データを読み取る SSD または通常のディスクがある場合は違いはありません。私は両方を持っており、すべてのデータに通常のディスクを使用しています。私は時々大きなデータセットを扱いますが、問題を経験したことはありません. もちろん、非常に負荷がかかる場合は、サーバーで作業します。
そのため、ギグとギグのデータについて話している場合は違いが生じる可能性がありますが、それでもディスクアクセスが制限要因であるとは思えません. ディスクの読み取りと書き込みを継続的に行っている場合を除きますが、その場合は、自分が何をしているのかをもう一度考え直すべきだと思います。そのお金を SDD ドライブに費やす代わりに、追加のメモリがより良い選択肢になる可能性があります。または、まともな計算サーバーを取得するように上司を説得してください。
偽のデータ フレームを使用し、SSD ディスクと通常のディスクでのテキスト形式とバイナリ形式の読み取りと書き込みを使用したタイミング実験。
> tt <- 100
> longtext <- paste(rep("dqsdgfmqslkfdjiehsmlsdfkjqsefr",1000),collapse="")
> test <- data.frame(
+ X1=rep(letters,tt),
+ X2=rep(1:26,tt),
+ X3=rep(longtext,26*tt)
+ )
> SSD <- "C:/Temp" # My ssd disk with my 2 operating systems on it.
> normal <- "F:/Temp" # My normal disk, I use for data
> # Write text
> system.time(write.table(test,file=paste(SSD,"test.txt",sep="/")))
user system elapsed
5.66 0.50 6.24
> system.time(write.table(test,file=paste(normal,"test.txt",sep="/")))
user system elapsed
5.68 0.39 6.08
> # Write binary
> system.time(save(test,file=paste(SSD,"test.RData",sep="/")))
user system elapsed
0 0 0
> system.time(save(test,file=paste(normal,"test.RData",sep="/")))
user system elapsed
0 0 0
> # Read text
> system.time(read.table(file=paste(SSD,"test.txt",sep="/"),header=T))
user system elapsed
8.57 0.05 8.61
> system.time(read.table(file=paste(normal,"test.txt",sep="/"),header=T))
user system elapsed
8.53 0.09 8.63
> # Read binary
> system.time(load(file=paste(SSD,"test.RData",sep="/")))
user system elapsed
0 0 0
> system.time(load(file=paste(normal,"test.RData",sep="/")))
user system elapsed
0 0 0
http://www.codinghorror.com/blog/2010/09/revisiting-solid-state-hard-drives.html には SSD に関する優れた記事があり、コメントは多くの洞察を提供します。
CPU バウンドか IO バウンドかに関係なく、実行している分析のタイプによって異なります。回帰モデリングを扱った個人的な経験によると、前者がより多くの場合に当てはまり、その場合 SSD はあまり役に立たないでしょう。
つまり、最初にアプリケーションをプロファイリングするのが最善です。
申し訳ありませんが、@jorisによる最も評価の高い回答に同意する必要があります。そのコードを実行すると、バイナリバージョンの書き込みにほとんど時間がかからないのは事実です。しかし、それはテストセットがおかしいからです。大きな列'longtext'は、すべての行で同じです。Rのデータフレームは、(ファクターを介して)重複する値を複数回保存することがないほどスマートです。
したがって、最後に、700MBのテキストファイルと335Kのバイナリファイルで終了します(もちろん、バイナリははるかに高速なxDです)
-rw-r--r-- 1 carlos carlos 335K Jun 4 08:46 test.RData
-rw-rw-r-- 1 carlos carlos 745M Jun 4 08:46 test.txt
ただし、ランダムデータで試してみると
> longtext<-paste(sample(c(0:9, letters, LETTERS),1000*nchar('dqsdgfmqslkfdjiehsmlsdfkjqsefr'), replace=TRUE),collapse="")
> test$X3<-rep(longtext,26*tt)
>
> system.time(write.table(test,file='test.txt'))
user system elapsed
2.119 0.476 4.723
> system.time(save(test,file='test.RData'))
user system elapsed
0.229 0.879 3.069
とファイルはそれほど違いはありません
-rw-r--r-- 1 carlos carlos 745M Jun 4 08:52 test.RData
-rw-rw-r-- 1 carlos carlos 745M Jun 4 08:52 test.txt
ご覧のとおり、経過時間はユーザーとシステムの合計ではありません...したがって、どちらの場合もディスクがボトルネックになります。はい、セミコロン、引用符、またはそのようなスタッフを含める必要はなく、メモリオブジェクトをディスクにダンプするだけなので、バイナリ保存は常に高速になります。
しかし、ディスクがボトルネックになるポイントは常にあります。私のテストは、NASソリューションを介して600MB/秒を超えるディスクの読み取り/書き込み時間を取得するリサーチサーバーで実行されました。50MB /秒を超えるのが難しいラップトップで同じことを行うと、違いに気付くでしょう。
したがって、実際に実際のbigDataを処理する必要がある場合(そして同じ1000文字の文字列を100万回繰り返すことはビッグデータではありません)、データのバイナリダンプが1 GBを超える場合は、優れたディスク(SSD入力データを読み取り、結果をディスクに書き戻す場合に適しています。
あなたのアプリケーションをプロファイリングするという John の提案に賛成しなければなりません。私の経験では、遅い部分は実際のデータ読み取りではなく、データを格納するためのプログラミング オブジェクトの作成、文字列からのキャスト、メモリ割り当てなどのオーバーヘッドです。
最初にコードのプロファイルを作成し、ハードウェアに投資する前に、代替ライブラリ (numpy など) を使用してどのような改善が得られるかを確認することを検討することを強くお勧めします。
SSD の読み取り時間と書き込み時間は、標準の 7200 RPM ディスクよりも大幅に長くなります (10k RPM ディスクを使用する価値はありますが、15k よりどれだけ改善されるかはわかりません)。そうです、データ アクセスの時間が大幅に短縮されます。
パフォーマンスの向上は否定できません。それから、経済学の問題です。2TB 7200 RPM ディスクは 1 個あたり 170 ドル、100GB SSD は 210 ドルです。そのため、大量のデータがある場合、問題が発生する可能性があります。
大量のデータを読み書きする場合は、SSD を入手してください。ただし、アプリケーションが CPU を集中的に使用する場合は、より優れたプロセッサを入手することでより多くのメリットが得られます。