我正在开发一个编辑 Pdf 文件的 Java 应用程序。此外,使用带有 Ghostscript 的 shell 脚本来制作 Pdf 的图像,然后在 Java 应用程序中将图像作为缓冲图像读取。当然,图像的创建需要一些时间。是否可以避免将图像保存在硬盘上?相反,我想使用仅存在于 RAM 中的虚拟位置。我尝试搜索此内容,但不确定要查找什么关键字。
最佳答案
您可以使 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,您的净 yield 不会那么大。
好消息是,您可以轻松测量和基准测试两种方法之间的差异((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”是否会带来值得的性能增益以及可以预期获得多少增益的唯一方法。
关于java - 如何创建虚拟磁盘空间以避免节省硬盘空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11100718/