我正在编写一个简单的命令行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
答案 0 :(得分:6)
二进制读取很快。打印到标准输出缓慢有两个原因:
您可以进行基准测试/配置文件。但是如果你真的想要“快速”,那就远离格式化来打印大量数据。
编译代码有助于加快转换速度。但同样,最快的解决方案将是