使用R/Python进行数据分析和固态硬盘(SSD)

12

有没有人在使用固态硬盘存储数据时,结合r/python编程语言的经验?理论上来说,如果主要进行读取操作,这应该会显著提高大型数据集的加载速度。我想找出这是否为真,并且是否值得投资于SSD以提高数据密集型应用程序中的IO速率。


感谢大家提供的出色回答!我想我有两种类型的应用程序:一种是在 R 中加载数据集,然后在内存中对数据进行分析。我猜 SSD 对这种应用程序不会有太大影响。然而,对于另一种应用程序,我必须逐行读取数据。而且这可能是几百兆字节的数据。我觉得这些应用程序可以从 SSD 中受益。 - signalseeker
1
我完全同意使用二进制格式存储数据可以显著提高速度。但是,我在寻找一种能够同时与R和Python兼容的通用二进制格式时遇到了困难。HDF5是一个选择,但我不确定R库的质量如何。 - signalseeker
1
特别是在逐行读取文本文件时,您拥有什么类型的驱动器并不重要。软件的开销是磁盘实际读取时间的多倍。如果您检查我的计时,您会发现“计时噪音”甚至使我的旧磁盘比SSD更快!关于Python和R可以共享的二进制格式,那将是一个非常有趣的新问题。我不知道这个问题的答案,但我相信这里会有一些人加入讨论。它不应该停留在评论中。 - Joris Meys
5个回答

19
我的看法是:只有当您的应用程序存储在SSD上时,而不是存储数据时,SSD才会有所回报。即使如此,只有在需要大量磁盘访问(例如操作系统)时才有用。人们指向分析是正确的。我可以告诉您,几乎所有的读取时间都花费在处理上,而不是从磁盘读取。
与其关注数据存储位置,倒不如考虑数据的格式。使用正确的应用程序和正确的格式可以加速读取数据。例如,使用R的内部格式而不是使用文本文件。切记:永远不要再使用文本文件。如果需要速度,请使用二进制格式。
由于开销问题,使用SSD或普通磁盘从中读取数据通常并没有什么区别。我两种都有,并且将普通磁盘用于所有数据。有时我会搬弄大型数据集,并且从未遇到过任何问题。当然,如果我必须进行重负载工作,我就会在我们的服务器上工作。
因此,当我们谈论吉字节级别的数据时,它可能会有所不同,但即便如此,我也很怀疑磁盘访问是限制因素。除非您不断地读写磁盘,但那时我会说,您应该重新考虑自己到底在做什么。与其把钱花在SSD驱动器上,不如考虑增加内存或说服老板为您购买一个良好的计算服务器。
使用虚假数据框进行时间实验,比较在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 

亲爱的投票者们。我并不介意被投票,但我想知道你们到底不同意什么... - Joris Meys

6

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是一个不错的选择)来读取输入数据并将结果写回磁盘。

这是一个关于如何正确测试命题的有趣观点。我不知道 data.frames 是如此聪明。不错! - PatrickT

2
我必须赞同John的建议,对你的应用程序进行分析。我的经验是,实际数据读取并不是慢的部分,而是创建包含数据的编程对象、从字符串转换、内存分配等开销。我强烈建议您先对代码进行分析,并考虑使用替代库(如numpy)来查看您可以获得什么改进,然后再考虑投资硬件。

0

SSD的读写速度比标准的7200 RPM磁盘显着更高(使用10k RPM磁盘仍然值得,不确定其与15k相比有多大改进)。因此,是的,您将获得更快的数据访问时间。

性能提升是不可否认的。然后,就经济问题而言。2TB 7200 RPM磁盘每个售价$170,而100GB SSD则售价$210。因此,如果您拥有大量数据,可能会遇到问题。

如果您要频繁读写大量数据,请购买SSD。但是,如果应用程序需要大量CPU运算,则更换更好的处理器会更加有益。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接