2010-11-24 11 views
12

ソリッドステートドライブに格納されたデータでr/pythonを使用する経験がある人はいませんか?ほとんどの場合、理論的には大きなデータセットの読み込み時間が大幅に改善されるはずです。データ集約型アプリケーションでIOレートを向上させるためにSSDに投資する価値があるかどうかを調べたいと思います。R/pythonとSSDを使用したデータ分析

+0

ありがとうございました。私はアプリケーションの2種類があると思います:1つは、私はRでデータセットをロードし、メモリ内のデータの分析を行います。私は、SSDはこの種のアプリにとっては大したことではないと思う。 しかし、他の種類の場合は、行単位でデータを読み込む必要があります。これは数百MBのデータになります。私はこれらのアプリがSSDに利益をもたらすことができると感じています。 – signalseeker

+1

バイナリ形式でデータを保存すると処理が大幅に高速化されることに完全に同意します。しかし、私はRとPythonの両方で動作する共通のバイナリ形式を見つけるのに苦労しています。 HDF5はオプションですが、Rライブラリがどれほど優れているかわかりません。 – signalseeker

+1

特にテキストファイルの行単位で読み込んだ場合、ドライブの種類は少しでも問題ありません。ソフトウェアのオーバーヘッドは、ディスク上の実際の読み取り時間の数倍です。私のタイミングをチェックすると、「タイミングノイズ」が私の古いディスクをSSDより速くすることさえあることがわかります! PythonとRで共有できるバイナリ形式に関しては、非常に興味深い新しい質問になるでしょう。私はその答えを知らないが、ここにいる人々の中にはチャイムがいると確信している。それはコメントにとどまるべきではない。 –

答えて

18

私の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 
+0

ありがとうございます。これはまさに私が探していたものです。 – signalseeker

+0

親愛なるdownvoters。私はダウン投票していませんが、正確にあなたが同意していないことを知りたいのですが... –

6

http://www.codinghorror.com/blog/2010/09/revisiting-solid-state-hard-drives.html にはSSDに関する良い記事がありますが、コメントには多くの洞察があります。

実行している分析のタイプ(CPUバインドかIOバウンドか)によって異なります。 回帰モデリングを扱っている個人的な経験は、前者がより多くの場合そうであると言います.SSDはそれほど役に立ちません。

要するに、アプリケーションを最初にプロファイルするのが最適です。

+0

+1のリンク。 –

0

SSDの読み書き時間は、標準の7200 RPMディスクよりもかなり高くなります(10k RPMディスクではまだ価値がありますが、15kを超える改善点は不明です)。そう、はい、データアクセスの時間がはるかに短くなります。

性能の向上は否定できない。そして、それは経済学の問題です。 2TB 7200 RPMディスクは170ドルで、100GB SSDSは210ドルです。したがって、データが大量にある場合は、問題が発生する可能性があります。

多くのデータを読み書きする場合は、SSDを入手してください。しかし、アプリケーションがCPUを大量に使用している場合は、より優れたプロセッサを使用することでさらに多くのメリットがあります。

2

私はあなたのアプリケーションをプロファイルするために2番目のジョンの提案をしなければなりません。私の経験は、それが遅い部分である実際のデータ読み込みではなく、データを格納するプログラミングオブジェクトを作成し、文字列からキャストする、メモリ割り当てなどのオーバーヘッドです。

私は強くお勧めしますまずコードを作成し、別のライブラリ(numpyなど)を使用して、ハードウェアに投資する前にどのような改善が得られるかを検討してください。

3

申し訳ありませんが、私は@ jorisによる定評のある回答に同意しないといけません。あなたがそのコードを実行すると、バイナリバージョンは書かれるのにほとんど時間がかかりません。しかし、これはテストセットが奇妙なためです。大きなコラム「長い文章」はすべての行で同じです。 Rのデータフレームは重複した値を2回以上(因子を介して)保存するのに十分なほどスマートです。

だから、最後に私たちは335Kのバイナリファイル対700メガバイトのテキストファイルで終了(もちろん、バイナリの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/sを超えるディスクの読み書き時間を取得するリサーチサーバで実行されました。ラップトップで同じことをしても、50MB/sを超えるのが難しい場合は、その違いに気づくでしょう。

実際にbigDataを処理しなければならない場合(同じ1,000文字の文字列は大きなデータではありません)、データのバイナリダンプが1 GBを超えると、入力データを読み込んで結果をディスクに書き戻すには良いディスク(SSDが良い選択です)。

+0

これは命題を適切にテストする方法に関する興味深い点です。私はデータを知らなかった。フレームはスマートだった。ニース! – PatrickT

関連する問題