有关加速GhostScript的任何提示吗?

时间:2010-12-28 19:41:23

标签: pdf ghostscript

我有一个100页的PDF大约50 MB。我正在运行下面的脚本,它每页大约需要23秒。 PDF是对纸质文档的扫描。

gswin32.exe -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dCompatibilityLevel=1.3 
            -dPDFSETTINGS=/screen -sOutputFile=out4.pdf 09.pdf

我有什么办法可以加快速度吗?我已经确定-dPDFSettings=/screen正在使它如此缓慢,但如果没有它我就没有得到很好的压缩......

更新 好的我尝试将其更新为下面的内容。我正确使用-c 30000000 setvmthreshold部分吗?

gswin32.exe -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dCompatibilityLevel=1.3 
            -dPDFSETTINGS=/screen -dNumRenderingThreads=2 -sOutputFile=out7.pdf 
            -c 30000000 setvmthreshold -f 09.pdf

5 个答案:

答案 0 :(得分:30)

如果您使用的是多核系统,请使用多个CPU内核:

-dNumRenderingThreads=<number of cpus>

让它使用最多30mb的RAM:

-c "30000000 setvmthreshold"

尝试禁用垃圾收集器:

-dNOGC

有关详细信息,请参阅Ghoscript文档中的Improving Performance部分。

答案 1 :(得分:11)

我在核心~300上处理i7页面PDF并发现添加以下选项可以提供显着的加速:

                            %-> comments to the right 
-dNumRenderingThreads=8     % increasing up to 64 didn't make much difference
-dBandHeight=100            % didn't matter much
-dBandBufferSpace=500000000 % (500MB)
-sBandListStorage=memory    % may or may not need to be set when gs is compiled
-dBufferSpace=1000000000    % (1GB)

-c 1000000000 setnvmthreshold -f对我来说没什么大不了的,FWIW。

答案 2 :(得分:6)

您没有说出计算机配备的CPU和RAM数量。

你的情况是这样的:

  • 扫描的PDF格式文档,平均每页大小为500 kB。这意味着每个页面基本上都是一张图片,使用扫描分辨率(至少200 dpi,甚至600 dpi)。
  • 您正在使用-dPDFSETTINGS=/screen使用Ghostscript重新提取它。此设置将使文件大小更小。其中最重要的是:
    1. 将所有(彩色或灰度)图像重新采样为72dpi
    2. 将所有颜色转换为sRGB

这两项操作在CPU和/或RAM使用方面都非常“昂贵”。

顺便说一下,您的-dCompatibilityLevel=1.3设置不是必需的;它已经被-dPDFSETTINGS=/screen隐含地设定了。

试试这个:

gswin32.exe ^
 -o output.pdf ^
 -sDEVICE=pdfwrite ^
 -dPDFSETTINGS=/screen ^
 -dNumRenderingThreads=2 ^
 -dMaxPatternBitmap=1000000 ^
 -c "60000000 setvmthreshold" ^
 -f input.pdf

此外,如果您使用的是64位系统,请尝试安装最新的32位Ghostscript版本(9.00)。它的性能优于64位版本。

让我告诉你,将600dpi扫描页面图像下采样到72dpi通常不需要23秒,但不到1秒。

答案 3 :(得分:1)

我可能在这里完全不合适,但您是否尝试过Djvu文件格式?它的工作原理就像一般扫描文档的魅力(即使有很多图片),它提供了更好的压缩文件:我在B&amp; W科学文章中获得了两倍的无损增益因素。

答案 4 :(得分:0)

为了加快将具有大位图图形的pdf光栅化为高质量的300 ppi png图像的速度,我发现将 -dBufferSpace设置得尽可能高 {{1 }}可用的核心数量最多对于大多数文件而言是最有效的,-dNumRenderingThreads提供的提升最大。

效果最好的具体值是:

  • -dBufferSpace以获得2 GB的缓冲区空间。这将一个相对较小的文件从14分钟栅格化到仅50秒。对于较小的文件,将其设置为1 GB并没有多大区别,但是对于较大的文件,则有很大的不同(有时快2倍)。出于某种原因尝试达到3 GB或更高容量会导致启动时出现错误“无法恢复的错误:.putdeviceprops中的rangecheck”。

  • -dBufferSpace=2000000000用于具有8核的计算机。相同文件的光栅化时间从14分钟增加到4分钟(如果使用4个线程,则花费8分钟)。将其与上面的-dNumRenderingThreads=8选项结合使用,将其从50秒减少到25秒。但是,与-dBufferSpace结合使用时,随着线程数量的增加,收益似乎会减少,并且对于某些文件几乎没有影响。奇怪的是,对于一些较大的文件,将线程数设置为1实际上比任何其他数字都快。

总体命令如下:

-dBufferSpace

这已通过Ghostscript 9.52进行了测试,并且来自测试@ wpgalle3的答案以及Ghostscript文档中的Improving performance部分中的建议。

文档中的一个主要结论是,当ghostscript使用“带模式”时,由于光栅图像输出大于gs -sDEVICE=png16m -r300 -o document.png -dNumRenderingThreads=8 -dBufferSpace=2000000000 -f document.pdf 的值,它可以利用多个内核来加快处理速度。 / p>

无效或适得其反的选项:

单独或与-dMaxBitmap一起设置-c "2000000000 setvmthreshold"(2 GB)似乎没有什么作用。

设置-dBufferSpace导致分段错误。

设置-sBandListStorage=memory(2 GB)显着减慢了该过程,并且显然使它陷入麻烦,写入了数百GB的临时文件而没有任何停止的迹象,促使我终止了该过程。

-dMaxBitmap=2000000000设置为-dBandBufferSpace的一半对较小的文件没有影响,但是实际上将较大的文件的处理速度大大降低了1.5-1.75倍。在Ghostscript文档的Banding parameters部分中,实际上建议不要使用-dBufferSpace:“如果您只想分配更多的内存用于绑定,以增加带宽并提高性能,请使用BufferSpace参数,不是BandBufferSpace。”