0

我正在开发一个编辑 Pdf 文件的 Java 应用程序。此外,带有 ghostscript 的 shell 脚本用于制作 Pdf 的图像,然后将图像作为缓冲图像在 Java 应用程序中读取。当然,图像的创建需要一些时间。可以避免将图像保存在硬盘上吗?相反,我想使用仅存在于 RAM 中的虚拟位置。我试图搜索这个,但我不确定我在寻找什么关键字。

4

2 回答 2

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”是否会导致值得的性能提升以及可以预期的增益的唯一方法。

于 2012-06-19T16:57:43.843 回答
0

试试Apache Commons VFS。它带来了一个虚拟文件系统 API 以及几个方便的实现,尤其是RAM之一

于 2012-06-19T12:20:06.200 回答