![](/img/trans.png)
[英]Extracting text data into a meaningful table for analysis using Python (or R)
[英]Data analysis using R/python and SSDs
有没有人使用r / python与存储在固态硬盘中的数据有任何经验。 如果您主要进行读取操作,理论上这应该会显着改善大型数据集的加载时间。 我想知道这是否属实,是否值得投资SSD以提高数据密集型应用程序的IO速率。
我的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的二进制文件(当然二进制文件的速度要快得多)
-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,你就会注意到它们之间的区别。
所以,如果你实际上必须处理真正的bigData(并且重复一百万次,相同的千字符串不是大数据),当数据的二进制转储超过1 GB时,你会欣赏有一个好的磁盘(SSD读取输入数据并将结果写回磁盘是一个很好的选择。
我必须提出约翰的第二个建议来描述您的申请。 我的经验是,实际数据读取不是缓慢的部分,而是创建编程对象以包含数据,从字符串转换,内存分配等的开销。
我强烈建议您首先分析您的代码,并考虑使用替代库(如numpy)来查看在投资硬件之前可以获得哪些改进。
SSD的读取和写入时间明显高于标准的7200 RPM磁盘(使用10k RPM磁盘仍然是值得的,不知道它在15k以上有多大改进)。 所以,是的,你可以在数据访问上获得更快的时间。
性能提升是不可否认的。 那么,这是一个经济学问题。 2TB 7200 RPM磁盘每片170美元,100GB SSDS售价210美元。 因此,如果您有大量数据,则可能会遇到问题。
如果您读取/写入大量数据,请获取SSD。 但是,如果应用程序是CPU密集型的,那么从获得更好的处理器中获益更多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.