12

有没有人有使用 r/python 和存储在固态驱动器中的数据的经验。如果您主要进行读取,理论上这应该会显着改善大型数据集的加载时间。我想知道这是否属实,是否值得投资 SSD 以提高数据密集型应用程序的 IO 速率。

4

5 回答 5

19

我的 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 
于 2010-11-24T10:13:28.360 回答
6

http://www.codinghorror.com/blog/2010/09/revisiting-solid-state-hard-drives.html 有一篇关于 SSD 的好文章,评论提供了很多见解。

取决于您正在执行的分析类型,无论是 CPU 限制还是 IO 限制。处理回归建模的个人经验告诉我,前者更常见,SSD 那时用处不大。

简而言之,最好先分析您的应用程序。

于 2010-11-24T02:37:24.310 回答
4

对不起,但我不得不不同意@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,你会注意到差异。

所以,如果你真的必须处理真正的大数据(并且重复一百万次相同的千字符串不是大数据),当数据的二进制转储超过 1 GB 时,你会欣赏有一个好的磁盘(SSD是一个不错的选择)用于读取输入数据并将结果写回磁盘。

于 2012-06-04T16:11:12.363 回答
2

我必须同意约翰的建议来分析您的申请。我的经验是,速度慢的不是实际的数据读取,而是创建包含数据的编程对象、从字符串转换、内存分配等的开销。

我强烈建议您首先分析您的代码,并考虑使用替代库(如 numpy),以查看在投资硬件之前可以获得哪些改进。

于 2010-11-24T06:52:07.317 回答
0

SSD 的读写时间明显高于标准的 7200 RPM 磁盘(使用 10k RPM 磁盘仍然值得,但不确定它比 15k 改进了多少)。所以,是的,您将获得更快的数据访问时间。

性能的提升是不可否认的。然后,这是一个经济问题。2TB 7200 RPM 磁盘每块 170 美元,100GB SSDS 价格为 210 美元。所以如果你有很多数据,你可能会遇到问题。

如果您读/写大量数据,请购买 SSD。但是,如果应用程序是 CPU 密集型应用程序,那么您将从获得更好的处理器中获益更多。

于 2010-11-24T02:40:22.980 回答