2010-11-24 48 views
12

有沒有人有任何使用r/python存儲在固態驅動器中的數據的經驗。如果您正在進行大部分讀取,理論上這應該會顯着改善大型數據集的加載時間。我想知道這是否屬實,以及是否值得投資固態硬盤來提高數據密集型應用中的IO速率。使用R/python和SSD進行數據分析

+0

感謝大家一些優秀的迴應!我想我有兩種類型的應用程序:一種是在R中加載數據集,然後對內存中的數據進行分析。我猜SSD對於這類應用程序無關緊要。 但是,對於其他類型,我必須逐行讀取數據。這可能是幾百MB的數據。我有一種感覺,這些應用程序可以從SSD中受益。 – signalseeker 2010-11-24 14:47:58

+1

我完全同意以二進制格式存儲數據會顯着加快速度。不過,我無法找到可以同時用於R和python的通用二進制格式。 HDF5是一個選項,但我不確定R libs有多好。 – signalseeker 2010-11-24 14:52:10

+1

特別是當逐行讀取文本文件時,它並不重要,你有什麼類型的驅動器。軟件的開銷是磁盤實際讀取時間的很多倍。如果你檢查我的時間,你會發現「定時噪聲」甚至使我的舊磁盤比SSD更快!關於Python和R可以共享的二進制格式,這將是一個非常有趣的新問題。我不知道那個答案,但我相信這裏有些人會加入進來。不應該留在評論中。 – 2010-11-24 15:23:21

回答

18

我的2美分:如果您的應用程序存儲在您的應用程序上,而不是您的數據,SSD只會帶來回報。即使如此,只有當需要大量訪問磁盤時,比如操作系統。人們正確地指出你的概況。我可以告訴你,幾乎所有的閱讀時間都是在處理,而不是在磁盤上讀取。

付出更多的努力來考慮您的數據的格式而不是它的存儲位置。讀取數據的速度可以通過使用正確的應用程序和正確的格式獲得。像使用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

SSD的讀取和寫入次數明顯高於標準的7200 RPM磁盤(它仍然值得使用10K RPM磁盤,不知道它在15K以上有多大改進)。所以,是的,你會在數據訪問上獲得更快的時間。

性能改進是不可否認的。那麼,這是一個經濟問題。 2TB 7200 RPM磁盤每塊170美元,100GB SSDS成本210美元。所以如果你有很多數據,你可能會遇到問題。

如果您讀取/寫入大量數據,請獲取SSD。但是,如果應用程序是CPU密集型的,那麼獲得更好的處理器會讓您受益匪淺。

2

我不得不第二次約翰的建議來分析你的應用程序。我的經驗是,它不是實際的數據讀取是緩慢的部分,它是創建編程對象來包含數據,從字符串投射,內存分配等開銷。

我強烈建議您簡介首先考慮您的代碼,並考慮使用其他庫(如numpy)來查看在投資硬件之前可以獲得哪些改進。

3

對不起,但我不同意@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/s。如果你在筆記本電腦中也是如此,那麼很難超過50MB/s,你會注意到它的差異。因此,如果你實際上必須處理真正的bigData(並且重複一百萬次,同一千字符串不是大數據),那麼當數據的二進制轉儲超過1 GB時,你會明白有一個好的磁盤(SSD是一個不錯的選擇)用於讀取輸入數據並將結果寫回磁盤。