使用R / python和SSD进行数据分析

有没有人使用r / python与存储在固态硬盘中的数据有任何经验。如果您主要进行读取操作,理论上这应该会显着改善大型数据集的加载时间。我想知道这是否属实,是否值得投资SSD以提高数据密集型应用程序的IO速率。     
已邀请:
我的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 
    
http://www.codinghorror.com/blog/2010/09/revisiting-solid-state-hard-drives.html 有一篇关于SSD的好文章,评论提供了很多见解。 取决于您正在进行的分析类型,无论是CPU绑定还是IO绑定。 处理回归建模的个人经验告诉我,以前更常见的情况是,SSD不会有太多用处。 简而言之,最好先对您的应用进行分析。     
对不起,但我不同意@joris的评分最高的答案。确实,如果运行该代码,二进制版本几乎不需要写入时间。但那是因为测试集很奇怪。每一行的大柱子'longtext'都是一样的。 R中的数据帧足够智能,不能多次存储重复值(通过因子)。 所以最后我们完成了一个700MB的文本文件而不是一个335K的二进制文件(当然二进制文件的速度要快得多)
-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读取输入数据并将结果写回磁盘是一个很好的选择。     
我必须提出约翰的第二个建议来描述您的申请。我的经验是,实际数据读取不是缓慢的部分,而是创建编程对象以包含数据,从字符串转换,内存分配等的开销。 我强烈建议您首先分析您的代码,并考虑使用替代库(如numpy)来查看在投资硬件之前可以获得哪些改进。     
SSD的读取和写入时间明显高于标准的7200 RPM磁盘(使用10k RPM磁盘仍然是值得的,不知道它在15k以上有多大改进)。所以,是的,你可以在数据访问上获得更快的时间。 性能提升是不可否认的。那么,这是一个经济学问题。 2TB 7200 RPM磁盘每片170美元,100GB SSDS售价210美元。因此,如果您有大量数据,则可能会遇到问题。 如果您读取/写入大量数据,请获取SSD。但是,如果应用程序是CPU密集型的,那么从获得更好的处理器中获益更多。     

要回复问题请先登录注册