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

12 投票
5 回答
4929 浏览
提问于 2025-04-16 07:31

有没有人有过使用 r/python 处理存储在固态硬盘(SSD)上的数据的经验?如果你主要是读取数据,理论上来说,这应该能大大提高大数据集的加载速度。我想知道这是否是真的,以及在数据密集型应用中,投资固态硬盘是否值得。

5 个回答

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,你就会注意到差别。

所以,如果你真的要处理大数据(重复一百万次同样的千字符串可不算大数据),当数据的二进制转储超过1GB时,你会很感激有一个好的磁盘(SSD是个不错的选择)来读取输入数据和将结果写回磁盘。

6

http://www.codinghorror.com/blog/2010/09/revisiting-solid-state-hard-drives.html 这篇文章讲了固态硬盘(SSD),评论区也有很多有用的见解。

这要看你在做什么样的分析,是在处理CPU的计算还是在处理数据输入输出。根据我个人在回归模型方面的经验,通常情况下是前者比较常见,这样的话SSD的作用就不大了。

总之,最好先对你的应用程序进行性能分析。

19

我想说的是:SSD(固态硬盘)只有在你的应用程序存储在上面时才有意义,而不是你的数据。即使这样,只有在需要频繁访问磁盘的情况下,比如操作系统,才会有明显的好处。大家提到的性能分析是对的。我可以告诉你,几乎所有的读取时间都花在处理上,而不是在磁盘读取上。

与其考虑数据存储在哪里,不如先想想你的数据格式。使用合适的应用程序和正确的格式可以加快数据读取速度。比如,使用R的内部格式,而不是在文本文件中摸索。记住这一点:永远不要再在文本文件中摸索。如果你需要速度,就用二进制格式。

由于开销的原因,使用SSD和普通硬盘读取数据一般没有太大区别。我两种硬盘都有,普通硬盘用来存储我的所有数据。我有时会处理大数据集,但从未遇到过问题。当然,如果需要处理特别大的数据,我就会在我们的服务器上工作。

所以,当我们谈论几GB的数据时,可能会有区别,但即便如此,我也很怀疑磁盘访问是否是限制因素。除非你一直在读取和写入磁盘,否则我觉得你应该重新考虑一下自己在做什么。与其花钱买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 

撰写回答