我目前正在开发一个必须将PDF转换为图像的Web服务,缩小这些图像并将每个比例分成不同的图块。
对于我们的大多数用户数据,图像大小并不大,整个过程都适合内存。
但特别是在将大矢量化PDF转换为图像时,分辨率达到50k + 50k分辨率时,一个BufferedImage
实例在内存中容易达到8GB或更多。
由于它是一个Web服务器,我想并行处理尽可能多的请求(甚至同时进行缩放和平铺处理) - 我需要一些内存控制术语。
我知道我可能不得不在步骤之间将更大的图像存储到磁盘上。实际上有一些有用的BufferedImage开源版本可以使用内存和磁盘(参见BigBufferedImage)......但是对于较小的图像,存在性能折衷。
90%的时间我可以毫无问题地在记忆中做所有事情。所以我想问:如何提前计算BufferedImage的内存大小?我看了一下Javadoc并用Google搜索了一段时间。我不是图像文件格式,颜色模型和合作伙伴的专家。而且不知道从哪里开始。任何人都能指出我需要了解的事情来进行这些计算,可能的准确性以及我需要考虑的其他内容吗?
答案 0 :(得分:1)
通常,图像的像素所需的内存可以像(伪代码)那样计算:
memoryNeeded = ceil(width * height * bitsPerPixel / 8.0)
其中8.0是byte
中的位数,ceil
向上舍入到最接近的整数。
对于某些格式,如果该值不可直接使用,则可能需要按如下方式计算bitsPerPixel
:
bitsPerPixel = sum(bitsPerSample for each samplePerPixel)
BufferedImage
这些不是完全内存要求,因为它还包含对Raster
,ColorModel
等的一些引用,但对于大图像,这个常数可以忽略不计。使用上面的公式计算的值应该足以决定是否在内存或磁盘上分配图像。