首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用R/python和SSD进行数据分析

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

Stack Overflow用户
提问于 2010-11-24 10:31:11
回答 5查看 4.3K关注 0票数 12

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-11-24 18:13:28

我的2分: SSD只有在你的应用程序存储在SSD上,而不是你的数据存储在SSD上的情况下才能获得回报。即使这样,也只有在需要大量访问磁盘的情况下才会出现这种情况,比如操作系统。人们向你指出分析是正确的。我可以不这样做就告诉你,几乎所有的读取时间都花在处理上,而不是在磁盘上读取。

考虑数据的格式而不是数据的存储位置会带来更大的回报。通过使用正确的应用程序和正确的格式,可以加快读取数据的速度。比如使用R的内部格式,而不是笨手笨脚地处理文本文件。让它成为一个感叹号:永远不要继续笨手笨脚地处理文本文件。如果您需要的是速度,请使用二进制。

由于开销的原因,如果您使用SSD或普通磁盘来读取数据,通常不会有什么不同。我两者都有,并且使用普通磁盘存储我所有的数据。我有时会处理大数据集,但从来没有遇到过问题。当然,如果我的工作非常繁重,我只需要在我们的服务器上工作。

因此,当我们谈论大量数据时,这可能会有所不同,但即使这样,我也非常怀疑磁盘访问是否是限制因素。除非你不断地读写磁盘,但我会说,你应该开始重新思考你到底在做什么。与其把钱花在SDD驱动器上,额外的内存可能是更好的选择。或者干脆说服老板给你弄个像样的计算服务器。

这是一个计时实验,使用伪造的数据帧,并在SSD磁盘和普通磁盘上以文本格式与二进制格式进行读写。

代码语言:javascript
运行
复制
> 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 
票数 19
EN

Stack Overflow用户

发布于 2010-11-24 10:37:24

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

取决于您正在进行的分析类型,无论是CPU绑定还是IO绑定。处理回归建模的个人经验告诉我,前者通常是这样的,那么SSD就不会有太大的用处。

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

票数 6
EN

Stack Overflow用户

发布于 2012-06-05 00:11:12

抱歉,我不得不不同意@joris的大多数评分答案。如果您运行该代码,那么二进制版本几乎不需要任何时间来编写,这是事实。但那是因为测试集很奇怪。大列'longtext‘对于每一行都是相同的。R中的数据帧足够智能,可以多次存储重复的值(通过因子)。

最后,我们得到一个700MB的文本文件,而不是一个335K的二进制文件(当然,二进制文件的xD速度要快得多)

代码语言:javascript
运行
复制
-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

然而,如果我们尝试随机数据

代码语言:javascript
运行
复制
> 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 

文件并没有太大的不同

代码语言:javascript
运行
复制
-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

正如您所看到的,经过的时间不是user+system...so的总和,在这两种情况下,磁盘都是瓶颈。是的,二进制存储总是更快,因为你不需要包括分号,引号或人员,只需将内存对象转储到磁盘即可。

但总有一天磁盘会成为瓶颈。我的测试是在一个研究服务器上运行的,通过NAS解决方案,我们可以获得超过600MB/s的磁盘读/写时间。如果你在笔记本电脑上执行同样的操作,很难超过50MB/s,你就会注意到区别。

因此,如果您实际上必须处理真正的bigData (并且重复一百万次相同的千字符串并不是大数据),当数据的二进制转储超过1 GB时,您将很高兴有一个好的磁盘(固态硬盘是一个很好的选择)来读取输入数据并将结果写回磁盘。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4262984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档