Perl“内存不足!”处理大批量作业时

时间:2015-04-09 21:58:38

标签: perl out-of-memory solaris

其他一些人,我现在是用Perl编写的一些遗留批处理作业的 happy 维护者。大约30k行代码,分为10-15个Perl文件。

我们有许多长期修复方法可以改善批处理过程的工作方式,但在短期内,我们必须为依赖于这些批处理作业输出的各种其他项目保持亮点。

这些批处理作业的主要部分的核心是一个哈希,它从一堆目录中的各种数据文件中收集了大量数据。当这些首次编写时,一切都很好地融入内存 - 不超过100MB左右。事情当然随着时间的推移而增长,哈希现在已经成长为盒子可以处理的东西(8GB),给我们留下了Perl的一个好消息:

Out of memory!

这当然是批处理作业的糟糕设计,我们有一个明确的(长期)路线图来改进这个过程。

但我有两个问题:

  • 我们可以看到什么样的短期选择,而不是在机器上投入更多内存?任何可以调整的操作系统设置? Perl运行时/编译标志可以设置吗?
  • 我也想了解为什么Perl会因“内存不足”而崩溃!错误,而不是使用机器上可用的交换空间。

作为参考,它在运行Solaris 10的Sun SPARC M3000上运行,具有8个内核,8 GB RAM,10 GB交换空间。

在机器上投入更多内存的原因并不是一个理想的解决方案,主要是因为它运行的硬件。与x86世界相比,为这些Sun盒子购买更多内存是非常昂贵的,而且我们可能不会将这些内存保留的时间比另一年长得多。

长期解决方案当然是重构很多代码库,然后在x86上迁移到Linux。

2 个答案:

答案 0 :(得分:1)

没有任何普遍适用的减少程序内存占用的方法;熟悉Perl的人需要扫描代码并找到与您的具体情况相关的内容

您可能会发现将哈希存储为基于磁盘的数据库会有所帮助,更常见的方法是使用Tie::Hash::DBD,这将允许您使用DBI支持的任何数据库,但它赢了帮助其值可以作为引用的哈希,例如嵌套哈希。 (正如ThisSuitIsBlackNot所评论的那样,DBM::Deep甚至克服了这个障碍。)

我认为你的Perl代码在启动时崩溃了?如果你有内存泄漏,那么找到原因应该更简单。或者,您可能很明显,哈希的初始填充是浪费的,因为它存储的数据永远不会被使用。如果您显示了部分代码,那么我相信有人可以提供协助

答案 1 :(得分:1)

尝试使用64位版本的解释器。我和#34;内存不足"有同样的问题。信息。在我的情况下,32bit草莓perl在终止之前吃了2Gb的RAM。 64位版本的翻译可以使用更大的数量。它吃掉了我16Gb的剩余部分而不是像地狱一样开始交换。但我收到了一个结果。