R写入stdout很慢。有什么方法可以改善?

时间:2015-01-11 00:59:18

标签: r stdout writetofile

我正在编写一个简单的命令行Rscript,它读取一些二进制数据并将其作为数字字符流输出。数据具有特定的格式,R有一个非常快速的库来处理有问题的二进制文件。文件(700万个字符)可以在不到一秒的时间内快速读取:

library(affyio)
system.time(CEL <- read.celfile("testCEL.CEL"))

user  system elapsed 
0.462   0.035   0.498

我想将一部分读取数据写入stdout:

str(CEL$INTENSITY$MEAN)
num [1:6553600] 6955 225 7173 182 148 ...

正如你可以看到它的数字数据有大约650万个整数。

写作速度非常慢:

system.time(write(CEL$INTENSITY$MEAN, file="TEST.out"))
user  system elapsed 
8.953  10.739  19.694

(这里是对文件进行写入,但是从Rscript到标准输出的操作需要相同的时间&#34;

cat(vector)根本没有提高速度。我找到的一个改进是:

system.time(writeLines(as.character(CEL$INTENSITY$MEAN), "TEST.out"))
user  system elapsed 
6.282   0.016   6.298

它与读取数据时的速度相差甚远(并且它读取的数据比这个特定的矢量多5倍)。此外,在进行之前,我有将整个矢量转换为字符的开销。当加入stdout时,我无法使用CTRL + C终止流,如果不小心我无法将其重定向到文件。

所以我的问题是 - 是否有更简单的方法将数字向量从R输出到stdout?

为什么阅读数据的速度比写作快得多?这不仅适用于二进制文件,而且通常是:

system.time(tmp <- scan("TEST.out"))
Read 6553600 items
user  system elapsed 
1.216   0.028   1.245 

1 个答案:

答案 0 :(得分:6)

二进制读取很快。打印到标准输出缓慢有两个原因:

  • 格式化
  • 实际打印

您可以进行基准测试/配置文件。但是如果你真的想要“快速”,那就远离格式化来打印大量数据。

编译代码有助于加快转换速度。但同样,最快的解决方案将是

  • 保留二进制文件
  • 不写入stdout或文件(但使用例如Redis之类的内容。)