Java 如何创建虚拟磁盘空间以避免节省硬盘空间?
我正在开发一个编辑Pdf文件的Java应用程序。此外,使用带有ghostscript的shell脚本生成Pdf的图像,然后在Java应用程序中将该图像作为缓冲图像读取。当然,创建图像需要一些时间。是否可以避免将图像保存在硬盘上?相反,我想使用一个只存在于RAM中的虚拟位置。我试图搜索这个,但我不确定我要找的关键字是什么。试试看。它带来了一个虚拟文件系统API和几个方便的实现,特别是一个您可以制作Ghostscript将映像(不是磁盘文件,而是)输出到stdout。然后,您可以制作另一个程序(或Java应用程序)来读取Java 如何创建虚拟磁盘空间以避免节省硬盘空间?,java,ghostscript,Java,Ghostscript,我正在开发一个编辑Pdf文件的Java应用程序。此外,使用带有ghostscript的shell脚本生成Pdf的图像,然后在Java应用程序中将该图像作为缓冲图像读取。当然,创建图像需要一些时间。是否可以避免将图像保存在硬盘上?相反,我想使用一个只存在于RAM中的虚拟位置。我试图搜索这个,但我不确定我要找的关键字是什么。试试看。它带来了一个虚拟文件系统API和几个方便的实现,特别是一个您可以制作Ghostscript将映像(不是磁盘文件,而是)输出到stdout。然后,您可以制作另一个程序(或J
stdin
因此,通过管道将两个应用程序连接起来将很容易。管道肯定是“只存在于RAM中的虚拟位置”,您不需要为此创建额外的虚拟文件系统
Ghostscript语法(Linux、Unix、MacOSX):
这肯定会避免将输出文件写入磁盘
然而,您主要关心的似乎是,实际将输出写入磁盘(以及再次从磁盘读取)会花费太多宝贵的处理时间
可能是Ghostscript的实际处理速度比将结果写入磁盘慢得多。在这种情况下,如果您避免磁盘I/O,您的净收益就不会那么大
好消息是,使用一些典型的PDF输入,您可以轻松测量和基准测试两种方法之间的差异(1)首先使用Ghostscript将文件写入磁盘,然后使用第二个应用程序再次从磁盘读取文件;(2)使用第二个应用程序将文件写入管道并直接从管道读取):
首先,“写入磁盘并再次从磁盘读取”方法:
time \
(gs \
-q \
-dBATCH \
-dNOPAUSE \
-sOutputFile=1.tiff \
-sDEVICE=tiffg4 \
-r600 \
-dLastPage=1 \
input.pdf \
&& \
identify 1.tiff)
time \
gs \
-q \
-dBATCH \
-dNOPAUSE \
-sOutputFile=%stdout \
-sDEVICE=tiffg4 \
-r600 \
-dLastPage=1 \
input.pdf \
| \
identify -
identify 1.tiff
我的PDF示例结果:
real 0m1.231s
user 0m1.188s
sys 0m0.024s
real 0m1.459s
user 0m1.422s
sys 0m0.036s
其次,“通过管道连接两个程序,避免磁盘I/O开销”方法:
time \
(gs \
-q \
-dBATCH \
-dNOPAUSE \
-sOutputFile=1.tiff \
-sDEVICE=tiffg4 \
-r600 \
-dLastPage=1 \
input.pdf \
&& \
identify 1.tiff)
time \
gs \
-q \
-dBATCH \
-dNOPAUSE \
-sOutputFile=%stdout \
-sDEVICE=tiffg4 \
-r600 \
-dLastPage=1 \
input.pdf \
| \
identify -
identify 1.tiff
我对相同示例PDF的结果:
real 0m1.231s
user 0m1.188s
sys 0m0.024s
real 0m1.459s
user 0m1.422s
sys 0m0.036s
第三,测量第二个程序从磁盘读取和处理文件所需的时间:
time \
(gs \
-q \
-dBATCH \
-dNOPAUSE \
-sOutputFile=1.tiff \
-sDEVICE=tiffg4 \
-r600 \
-dLastPage=1 \
input.pdf \
&& \
identify 1.tiff)
time \
gs \
-q \
-dBATCH \
-dNOPAUSE \
-sOutputFile=%stdout \
-sDEVICE=tiffg4 \
-r600 \
-dLastPage=1 \
input.pdf \
| \
identify -
identify 1.tiff
在本例中,我的结果是:
real 0m0.023s
user 0m0.011s
sys 0m0.006s
当然,你的样品结果可能会非常非常不同。但是,进行(并重复多次)这样的测量是确定在您的情况下“避免磁盘I/O”是否会带来值得一试的性能提升,以及预期的提升幅度的唯一方法。我想我有点困惑了。如果要将图像保留在RAM中,为什么不缓存
缓冲区图像
?