gpt4 book ai didi

处理大批量作业时出现 Perl "Out of memory!"

转载 作者:行者123 更新时间:2023-12-01 06:45:11 26 4
gpt4 key购买 nike

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

我们有很多改进批处理过程工作方式的长期修复,但在短期内,我们必须为依赖于这些批处理作业输出的各种其他项目保持正常运转。

这些批处理作业的主要部分的核心是一个哈希,它加载了从一堆目录中的各种数据文件中收集的一堆数据。首次编写这些内容时,所有内容都很好地放入内存中——不超过 100MB 左右。多年来,事情当然在增长,哈希现在增长到盒子可以处理的大小 (8GB),给我们留下了来自 Perl 的好消息:

内存不足!

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

但是我有两个问题:

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

作为引用,这是在运行 Solaris 10 的 Sun SPARC M3000 上运行的,具有 8 个内核、8 GB RAM、10 GB 交换空间。

在机器上投入更多内存并不是真正理想的解决方案,主要是因为它运行的硬件。与 x86 世界相比,为这些 Sun 盒子购买更多内存的成本高得离谱,而且我们可能不会再保留这些内存超过一年了。

长期的解决方案当然是重构大量代码库,并迁移到 Linux on x86。

最佳答案

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

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

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

关于处理大批量作业时出现 Perl "Out of memory!",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29549793/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com