2012-06-19 76 views
0

我正在编辑PDF文件的Java应用程序。此外,使用带ghostscript的shell脚本来制作Pdf图像,然后在Java应用程序中将图像作为缓冲图像读取。当然,图像的创建需要一些时间。可以避免将图像保存在硬盘上?相反,我想使用仅存在于RAM中的虚拟地点。我试图寻找这个,但林不知道什么关键字我寻找。如何创建虚拟磁盘空间以避免保存在硬盘上?

+0

我想我很困惑。如果你想将图像保存在RAM中,为什么不缓存'BufferedImage'? – Gene

回答

1

你可以让Ghostscript输出图像(而不是磁盘文件,但是)到stdout。然后你可以让另一个程序(或你的Java应用程序)从stdin中读取。

因此,通过管道可以很容易地连接两个应用程序。一个管道肯定是一个'虚拟的地方,只存在于内存',你不需要为此创建一个额外的虚拟文件系统。

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”是否会导致性能增益值得值得的唯一方法,并且还可以获得多少增益。