您可以让 Ghostscript 将图像(不是到磁盘文件,而是)输出到stdout。然后您可以制作另一个程序(或您的 Java 应用程序)来读取 stdin。
因此,很容易通过管道连接两个应用程序。管道肯定是“只存在于 RAM 中的虚拟位置”,您不需要为此创建额外的虚拟文件系统。
Ghostscript 语法(Linux、Unix、MacOSX):
gs \
-q \
-dBATCH \
-dNOPAUSE \
-sOutputFile=%stdout \
-sDEVICE=tiffg4 \
-r600 \
-dLastPage=1 \
input.pdf \
| \
identify -
这肯定会避免将输出文件写入磁盘...
但是,您主要担心的是,将输出实际写入磁盘(并再次从磁盘读取)会花费您太多宝贵的处理时间。
可能Ghostscript 的实际处理比将结果写入磁盘要慢得多。在这种情况下,如果您避免磁盘 I/O,您的净收益不会那么好。
好消息是您可以轻松测量和基准测试这两种方法之间的差异((1) 首先使用 Ghostscript 将文件写入磁盘,然后使用第二个应用程序再次从磁盘读取文件;(2) 将文件写入管道并读取直接从带有第二个应用程序的管道中)使用一些典型的 PDF 输入:
首先,'写入磁盘并再次从磁盘读取'的方法:
time \
(gs \
-q \
-dBATCH \
-dNOPAUSE \
-sOutputFile=1.tiff \
-sDEVICE=tiffg4 \
-r600 \
-dLastPage=1 \
input.pdf \
&& \
identify 1.tiff)
我对示例 PDF 的结果:
real 0m1.231s
user 0m1.188s
sys 0m0.024s
第二,“通过管道连接两个程序,避免磁盘 I/O 开销”的方法:
time \
gs \
-q \
-dBATCH \
-dNOPAUSE \
-sOutputFile=%stdout \
-sDEVICE=tiffg4 \
-r600 \
-dLastPage=1 \
input.pdf \
| \
identify -
我对同一示例 PDF 的结果:
real 0m1.459s
user 0m1.422s
sys 0m0.036s
第三,测量你的第二个程序需要从磁盘读取和处理文件的时间:
identify 1.tiff
我在这个例子中的结果:
real 0m0.023s
user 0m0.011s
sys 0m0.006s
当然,您的样本结果可能会非常非常不同。但是进行(并重复多次)此类测量是确定在您的情况下“避免磁盘 I/O”是否会导致值得的性能提升以及可以预期的增益的唯一方法。