我正在开发一个编辑 Pdf 文件的 Java 应用程序。此外,带有 ghostscript 的 shell 脚本用于制作 Pdf 的图像,然后将图像作为缓冲图像在 Java 应用程序中读取。当然,图像的创建需要一些时间。可以避免将图像保存在硬盘上吗?相反,我想使用仅存在于 RAM 中的虚拟位置。我试图搜索这个,但我不确定我在寻找什么关键字。
2 回答
您可以让 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”是否会导致值得的性能提升以及可以预期的增益的唯一方法。
试试Apache Commons VFS。它带来了一个虚拟文件系统 API 以及几个方便的实现,尤其是RAM之一