【问题标题】:Pdf to image conversion takes an enormous amount of spacePdf到图像的转换需要大量的空间
【发布时间】:2018-10-16 12:43:29
【问题描述】:

我有一个快速而肮脏的 python 脚本,它以 pdf 作为输入并将页面保存为图像数组(使用 pdf2image)。

我不明白的是:72 张图片占用 920MB 内存。但是,如果我将图像保存到文件中然后重新加载它们,我会得到几乎超过 30-40MB(图像的组合大小为 29MB)。那有意义吗?

我还尝试使用 pickle 转储数组,在由于 MemError 崩溃之前我达到了大约 3GB。我完全不知道是什么消耗了这么多内存......

【问题讨论】:

  • 该工具最有可能在解码时将元数据存储在内存中。例如未压缩的颜色映射(请记住,PNG 和 JPG 是压缩的,但原始数据会占用更多空间)。因此,取决于图像的大小以及它们具有的颜色数量等,是的。听起来有共鸣。 pickle 模块(不确切知道内部工作原理)很可能会复制您的所有值,必须将它们打包到它熟悉的结构中,这很容易使内存使用量翻倍。可悲的是,在那里工作的唯一方法是将其分块。
  • 这是我的怀疑。如何释放元数据?不知何故必须有一种方法可以手动清理它(垃圾收集模块不起作用)
  • 您必须提交错误报告、功能请求或创建修复此库问题的补丁。我最好的猜测是你现在不能。我以前使用过这个库,但从来没有遇到过问题,因为我从来没有真正处理过包含许多/大图像的大型 PDF。
  • 好的,我找到了罪魁祸首:该模块将 pdf 转换为 ppm 图像,这些图像非常巨大。我必须找到一种方法将 PPM 转换为 png 或 jpg 之类的东西,这应该可以解决问题......
  • 你试过fmt=jpg作为参数吗?

标签: python image pdf memory


【解决方案1】:

使用大量内存的原因很可能是由于使用过多的元数据、未压缩的图像数据(原始颜色数据)或库/工具本身内的无损图像编解码器。

这也可能取决于图片的大小、数量等。

最后一点,关于泡菜。 Pickle 本身是 Python 用来保存某些变量状态的内存转储格式。将内存转储到磁盘上的会话状态是一项相当繁重的任务。 Python 不仅需要将所有内容转换为启用保存状态的格式,而且还必须在保存时将所有数据复制到已知状态。为此,它可能会占用大量内存和磁盘。 (通常只有这样才能将数据分块)。

在回答一些 cmets 时,一种解决方案是传递参数 fmt=jpg,它使图像保持压缩状态,从而降低资源使用率。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 2015-04-19
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    相关资源
    最近更新 更多