我可以让 GhostScript 使用超过 2 GB 的内存吗?

Posted

技术标签:

【中文标题】我可以让 GhostScript 使用超过 2 GB 的内存吗?【英文标题】:Can I make GhostScript use more than 2 GB of RAM? 【发布时间】:2020-09-07 08:31:38 【问题描述】:

我在 Windows 7 和 16GB RAM 的 64 位处理器上运行 64 位版本的 GhostScript (9.50)。

当我尝试分配一个总计超过 2 GB RAM 的过多数组时,GhostScript 会返回一条随机错误消息(它会告诉我数组命令中有类型错误)。

明确地说,我在 Windows 任务监视器中看到内存使用量的增长,而不是在 GhostScript 中

我想知道为什么会这样。

更重要的是,我想知道我是否可以覆盖此行为。

编辑:此代码产生错误--

/TL 25000 def 
/TL- TL 1 sub def 
/G TL array def
0 1 TL-  dup == flush G exch TL array put for

错误如下所示:这是我收到的消息的最后一点

5335 
5336 
5337 
5338 
5339 
5340 
5341 
5342 
5343 
5344 
5345 
Unrecoverable error: typecheck in array 
Operand stack: --nostringval-- --- 
Begin offending input --- 
/TL 25000 def /TL- TL 1 sub def /G TL array def 0 1 TL-  dup == flush G exch TL array put for --- End offending input --- file offset = 0 gsapi_run_string_continue returns -20

【问题讨论】:

【参考方案1】:

几乎可以肯定,RAM 的数量不是限制因素,但如果您要发布实际的错误消息,它会有所帮助。它对你来说可能是“随机的”,但它对使用 PostScript 编程的人来说很有意义。

您很可能已经超出了其他一些内部限制,例如操作数堆栈大小,但没有看到 PostScript 程序或错误消息,我不能说更多。我可以说(64 位)Ghostscript 会很高兴地处理超过 2GB 的 RAM,我上周正在运行一个文件,其中 Ghostscript 使用 8.1GB。

请注意,PostScript 本身基本上是一种 32 位语言;虽然 Ghostscript 扩展了 PostScript 语言参考手册中记录的许多架构限制(例如数组和字符串中的 64K 元素),但超出 32 位限制基本上是未指定的。

至于你是否可以改变行为,这取决于究竟问题是什么,我无法从这里判断。

编辑

这是 Ghostscript 运行测试文件完成的屏幕截图,以及显示进程正在使用的内存量的任务管理器显示。未显示的是我之后从 PostScript 环境运行的 vmstatus。这表明 Ghostscript 认为它使用了 10,010,729,850 字节,最多为 10,012,037,312。我的计算器显示 9,562.8MB 为 10,027,322,572.4 字节,因此非常接近。

要回答 cmets 中的要点,这是(您可能会说)在具有大量内存的 64 位 Windows 10 安装上。

几乎可以肯定,区别在于自 9.52 版本以来已修复的问题。在(对我而言)5360 次迭代后,9.52 64 位二进制文​​件确实以 VMerror 退出。显然,尝试使用大量 PostScript 内存(相对于画布内存)并不常见,尤其是因为许多 PostScript 解释器根本不允许这样做,所以这不会多运动。

Ghostscript Git 存储库是here,如果您想检查提交并尝试找出导致更改的原因。你只需要回到今年 3 月,大约 3 月 19 日之前的任何时间都应该是 9.52。

除了简单的好奇之外,是否有理由尝试使用 PostScript 中的大量内存?

【讨论】:

抱歉 - 我称错误消息为“random-ish”,尽管它很清楚,而是因为它只是错误的:正如消息所示,GhostScript 执行了 5345 次没有类型错误的“array”,但是完全相同的代码在第 5345 次尝试中失败。我在错误发生前几秒钟得到了 Windows 任务监视器的屏幕截图,这个过程使用了 2,099,600 kb。另一个屏幕截图清楚地表明我有 5GB 的 RAM 可用。 我在这里使用 GhostView 的默认命令行运行 GhostScript。 该消息不会是假的,但它可能由您意想不到的事情触发。例如,如果您用尽了可能返回 limitcheck 的内部限制。或者更高级别的处理可能会将来自较低级别代码的错误转换为不同类型的错误。我不知道 GhostView 的默认命令行是什么意思,我认为它本身没有。命令行取决于您在做什么(例如 PDF 或 PostScript 或 EPS、显示、渲染到图像文件、打印...)。恐怕没有看到 PostScript 程序和命令行,我真的无法提供任何帮助 嗯,你知道你真的应该编辑你的问题,而不是我的答案吗? :-) 使用您建议编辑到我的答案中的代码、当前 9.53.0 候选发布版本的 64 位调试版本以及“gswin64c test.ps”命令行我目前最多根据任务管理器,迭代 7264 具有 2,795.0 MB 的已提交内存分配,并且仍在攀升。我可能没有足够的时间让它完成,因为这会给(Ghostscript)内存管理器带来压力,所以它很慢。

以上是关于我可以让 GhostScript 使用超过 2 GB 的内存吗?的主要内容,如果未能解决你的问题,请参考以下文章

奇怪的问题,ghostscript 和 pdf 文件

无法导入ghostscript

使用 ghostscript 删除页面(不提取范围)

Ghostscript - 后记代码的缩进

直接打印时 GhostScript 挂起

让 ghostscript 接收名称中带有空格的文件(例如“我的文档”中的某些内容)