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