我有一个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
答案 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数量。
你的情况是这样的:
-dPDFSETTINGS=/screen
使用Ghostscript重新提取它。此设置将使文件大小更小。其中最重要的是:
这两项操作在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。”