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

标签 java ghostscript

我正在开发一个编辑 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/

相关文章:

.net - 有没有办法在不安装的情况下引用ghostscript DLL?

java - 编辑类和方法,以便可以从另一个方法调用它

java - 如何添加十六进制数

javascript - 错误 : Cloud Functions for Firebase spawn EACCES (ghostscript)

pdf - 使用 Ghostscript 将 PDF 渲染为 PNG 时,请遵守 PDF 中的 MediaBox/CropBox

pdf - 使用 ghostscript 将 png 转换为 pdf

python - 如何更新文本文件中给定章节中子章节的数量?

java - 使用 Hibernate 查询语言的 PostgreSQL 全文搜索无法执行查询

java - 在正确的时间启动具有 Intent 过滤器的 Activity

java - 销毁当前类对象并通过线程运行同一个类