Java 如何创建虚拟磁盘空间以避免节省硬盘空间?

Java 如何创建虚拟磁盘空间以避免节省硬盘空间?,java,ghostscript,Java,Ghostscript,我正在开发一个编辑Pdf文件的Java应用程序。此外,使用带有ghostscript的shell脚本生成Pdf的图像,然后在Java应用程序中将该图像作为缓冲图像读取。当然,创建图像需要一些时间。是否可以避免将图像保存在硬盘上?相反,我想使用一个只存在于RAM中的虚拟位置。我试图搜索这个,但我不确定我要找的关键字是什么。试试看。它带来了一个虚拟文件系统API和几个方便的实现,特别是一个您可以制作Ghostscript将映像(不是磁盘文件,而是)输出到stdout。然后,您可以制作另一个程序(或J

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

试试看。它带来了一个虚拟文件系统API和几个方便的实现,特别是一个

您可以制作Ghostscript将映像(不是磁盘文件,而是)输出到stdout。然后,您可以制作另一个程序(或Java应用程序)来读取
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中,为什么不缓存
缓冲区图像