如何创建虚拟磁盘空间以避免节省硬盘?
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 一个
【讨论】:
以上是关于如何创建虚拟磁盘空间以避免节省硬盘?的主要内容,如果未能解决你的问题,请参考以下文章