有没有人有使用 r/python 和存储在固态驱动器中的数据的经验。如果您主要进行读取,理论上这应该会显着改善大型数据集的加载时间。我想知道这是否属实,是否值得投资 SSD 以提高数据密集型应用程序的 IO 速率。
5 回答
我的 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 的二进制文件(当然二进制要快得多 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是一个不错的选择)用于读取输入数据并将结果写回磁盘。
我必须同意约翰的建议来分析您的申请。我的经验是,速度慢的不是实际的数据读取,而是创建包含数据的编程对象、从字符串转换、内存分配等的开销。
我强烈建议您首先分析您的代码,并考虑使用替代库(如 numpy),以查看在投资硬件之前可以获得哪些改进。
SSD 的读写时间明显高于标准的 7200 RPM 磁盘(使用 10k RPM 磁盘仍然值得,但不确定它比 15k 改进了多少)。所以,是的,您将获得更快的数据访问时间。
性能的提升是不可否认的。然后,这是一个经济问题。2TB 7200 RPM 磁盘每块 170 美元,100GB SSDS 价格为 210 美元。所以如果你有很多数据,你可能会遇到问题。
如果您读/写大量数据,请购买 SSD。但是,如果应用程序是 CPU 密集型应用程序,那么您将从获得更好的处理器中获益更多。