繁体   English   中英

Java BufferedImage:预先计算内存大小

[英]Java BufferedImage: Calculate Memory Size in Advance

我目前正在开发一个Web服务,该服务必须将PDF转换为图像,将这些图像缩小尺寸,并将每个比例分成不同的图块。

对于我们大多数用户的数据,图像大小不会很大,并且整个过程都可以存储到内存中。

但是,尤其是当将大型矢量化PDF转换为图像,从而获得50k乘以50k分辨率的分辨率时,一个BufferedImage实例很容易达到8GB或更多的内存。

由于它是一台Web服务器,因此我想并行处理尽可能多的请求(甚至同时进行缩放和平铺操作)-我需要一些内存控制条款。

我知道在步骤之间可能必须将更大的图像存储到磁盘。 实际上,有一些有用的BufferedImage开源版本可以使用内存和磁盘(请参阅BigBufferedImage)……但是在性能上需要权衡,尤其是对于较小的图像。

90%的时间我可以毫无问题地完成内存中的所有操作。 因此,我想问 :如何预先计算BufferedImage的内存大小? 我调查了Javadoc,然后Google退出了一段时间。 我并不是图像文件格式,颜色模型等方面的专家。 而且不知道从哪里开始。 有人可以指出我进行这些计算时需要了解的事情,可能达到的准确度以及需要考虑的其他事项吗?

通常,可以计算图像像素所需的内存,例如(伪代码):

memoryNeeded = ceil(width * height * bitsPerPixel / 8.0)

其中8.0是byte的位数, ceil四舍五入到最接近的整数。

对于某些格式,如果该值不直接可用,则可能必须按以下方式计算bitsPerPixel

bitsPerPixel = sum(bitsPerSample for each samplePerPixel)

这些对于BufferedImage并不是确切的内存要求,因为它还包含对RasterColorModel等的一些引用,但是对于大图像,此常量可以忽略不计。 使用上述公式计算出的值应足以决定是否在内存或磁盘上分配映像。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM