如何在页面上找到R数字的字节大小?

时间:2016-12-05 20:05:22

标签: r memory size qa figures

我想在各个页面上监控R中生成的数字的基本质量,例如每页的字节大小,...... 我现在只能对普通页面进行质量保证,请参阅以下章节。 我认为必须为平均措施建立一些内容。

Rplots.pdf生成4页的代码,我想知道输出中每页的字节大小;任何其他页面输出的统计数据也是受欢迎的; 您可以通过对象here获取基本内存监控,但我希望它与PDF中的输出相对应

# https://stat.ethz.ch/R-manual/R-devel/library/graphics/html/plot.html
require(stats) # for lowess, rpois, rnorm
plot(cars)
lines(lowess(cars))

plot(sin, -pi, 2*pi) # see ?plot.function

## Discrete Distribution Plot:
plot(table(rpois(100, 5)), type = "h", col = "red", lwd = 10,
     main = "rpois(100, lambda = 5)")

## Simple quantiles/ECDF, see ecdf() {library(stats)} for a better one:
plot(x <- sort(rnorm(47)), type = "s", main = "plot(x, type = \"s\")")
points(x, cex = .5, col = "dark red")

## TODO summarise here the byte size of figures in the figures (1-4)
# Output: Rplot.pdf where 4 pages; I want to know the size of each page in bytes

我目前正在命令行中进行基本的质量保证,但是想将其中的一部分移动到R,以便更快地观察错误。

预期输出:字节大小,例如ls -l

的第4列

获取输出文档中平均单个页面的字节大小

限制

  • 要求页面中数据的同质性。仅当页面全部来自同一样本时,此方法才有效。 否则,它很麻烦,因为它只是平均值,而不是描述个体现象。 其他可能的弱点
  • PDF元素和元数据。整体考虑pdf文件,而不是关注图形对象本身。因此,这限制了绝对值的使用,因为filesize还包含与图形对象无关的标题和其他元数据。

代码

filename <- "main.pdf"
filesize <- file.size(filename)
# http://unix.stackexchange.com/q/331175/16920
pages <- Rpoppler::PDF_info(filename)$Pages 

# print page size (= filesize / pages)
pagesize <- filesize / pages

## data of example file 
num 7350960
int 62
num 118564

输入:任何62页的文件
输出:平均单个页面大小(118564)

测试and's回答

输出,但您无法轻松将输入更改为您想要的pdf文件

     files                             size_bytes 
[1,] "./test_page_size_pdf/page01.pdf" "4,123,942"
[2,] "./test_page_size_pdf/page02.pdf" "    4,971"
[3,] "./test_page_size_pdf/page03.pdf" "    4,672"
[4,] "./test_page_size_pdf/page04.pdf" "    5,370"

输入:任何64页的文件
预期输出:67(= 64 + 3)页,而不是4分析

R:3.3.2
操作系统:Debian 8.5

2 个答案:

答案 0 :(得分:4)

下载并安装pdftk实用程序(如果它尚未在您的系统上),然后从R中尝试以下其中一种替代方法。

1)它将返回一个数据框,其中包含页面文件大小(以字节为单位)和其他信息。

myfile <- "Rplots.pdf"
system(paste("pdftk", myfile, "burst"))
file.info(Sys.glob("pg_*.pdf"))

它还会生成一个文件doc_data.txt,其中包含一些可能或可能不感兴趣的杂项信息。

1a)此替代方案不会生成任何文件。它只会将页面的字符大小作为数字向量返回。

myfile <- "Rplots.pdf"
pages <- as.numeric(read.dcf(pipe(paste("pdftk", myfile, "dump_data")))[, "NumberOfPages"])
cmds <- sprintf("pdftk %s cat %d output - | wc -c", myfile, seq_len(pages))
unname(sapply(cmds, function(cmd) scan(pipe(cmd), quiet = TRUE)))

如果pdftkwc在您的路径上,则上述情况应该有效。请注意,在Windows上,您可以在Rtools发行版中找到wc,一旦安装了Rtools,通常为"C:\\Rtools\\bin\\wc"

2)此替代方案类似于(1)但使用动画包:

library(animation)

ani.options(pdftk = "/path/to/pdftk")
pdftk("Rplots.pdf", "burst", "pg_%04d.pdf", "")
file.info(Sys.glob("pg_*.pdf"))

答案 1 :(得分:2)

要测量pdf文件中每个页面的大小,我建议:

test_size <- TRUE
pdf_name <- "masterpiece"

if(test_size){
  dir.create("test_page_size_pdf")
  pdf_address <- paste0("./test_page_size_pdf/page%02d.pdf")  
} else { pdf_address <- paste0("./", pdf_name, ".pdf")}

pdf(pdf_address, width=10, height=6, onefile=!test_size)
par(mar=c(1,1,1,1), oma=c(1,1,1,1))

  plot(rnorm(10^6, 100, 5), type="l")
  plot(sin, -pi, 2*pi) 
  plot(table(rpois(100, 5)), type = "h", col = "red", lwd = 10,
     main = "rpois(100, lambda = 5)")
  plot(x <- sort(rnorm(47)), type = "s", main = "plot(x, type = \"s\")")
  points(x, cex = .5, col = "dark red")

dev.off()

if(test_size){
  files <- paste0("./test_page_size_pdf/", list.files("./test_page_size_pdf/"))
  size_bytes <- format(file.size(files), big.mark = ",")
  file.remove(files)
  file.remove("test_page_size_pdf")
  cbind(files, size_bytes)
}

R中pdf页面的大小取决于三个方面:plot()的内容,pdf()函数中使用的选项以及{{1}中定义的绘图选项}}。

这一切都很难估计。你还提到你喜欢有类似于shell函数par()的东西,它也运行在文件上。因此,在此解决方案中,我创建了一个临时文件夹ls,其中我们将pdf的每个页面分别保存在一个文件中。我们使用选项dir.create()实现此功能。绘图完成后,每个pdf页面文件以及临时文件夹都将被删除。你可以在控制台中看到结果。

如果您已完成测试并希望将结果放在单个文件中,则只需在此脚本的第一行中更改变量onefile。顺便说说;我有点怀疑页面的大小是图像质量的代理。 Pdf是一种矢量格式,因此大小与元素数量相对应:请参阅我的示例中第一页的大小,其中我绘制了1mio点。