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

Posted

技术标签:

【中文标题】如何创建虚拟磁盘空间以避免节省硬盘?【英文标题】:How to create virtual disk space to avoid saving on hard disk? 【发布时间】:2012-06-19 12:16:47 【问题描述】:

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

【问题讨论】:

我想我很困惑。如果您想将图像保存在 RAM 中,为什么不缓存 BufferedImage 【参考方案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”是否会导致值得的性能提升以及可以预期的增益的唯一方法。

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于如何创建虚拟磁盘空间以避免节省硬盘?的主要内容,如果未能解决你的问题,请参考以下文章

如何在为虚拟机增加磁盘后初始化磁盘

对于已预先分配的虚拟机硬盘,如何压缩或者减小其所占空间

如何扩大VMware虚拟机的硬盘磁盘空间大小

虚拟硬盘格式-厚置备,精简

Linux如何创建并挂载虚拟磁盘

如何清理VMware虚拟机占用的硬盘空间