你遇到了什么样的问题,“大”对你来说意味着什么?我有朋友需要将200 Gb文件加载到内存中,所以他们对于优秀技巧的想法与预算购物者有很大不同,因为它对于250 MB内存造成的最小VM片(实际上是我的手机不止)。
一般来说,即使没有使用它,Perl也会保留您使用的任何内存。在一个方向上实现优化记忆,可能会对另一个产生负面影响,如速度。
这不是一个全面的列表(多在Programming Perl有):
☹使用Perl内存分析工具,帮助您找到问题区域。请参阅Profiling heap memory usage on perl programs和How to find the amount of physical memory occupied by a hash in Perl?
☹使用可能的最小范围的词法变量,以便Perl在不需要时重新使用该内存。
☹避免创建大的临时结构。例如,读取一个带有foreach
的文件会一次读取所有输入。如果您只需要逐行,请使用while
。
foreach (<FILE>) { ... } # list context, all at once
while(<FILE>) { ... } # scalar context, line by line
☹你可能甚至不需要在内存中有文件。Memory-map files instead of slurping them
☹如果您需要创建大数据结构,请考虑类似DBM::Deep或其他存储引擎,以便将大部分数据从RAM和磁盘中取出,直到您需要为止。
☹不要让人们使用您的程序。每当我这样做,我已经减少了大约100%的内存占用。它也减少了支持请求。
☹通过引用传递大量文本和大量聚合,因此您不需要复制,从而存储相同的信息两次。如果因为要改变某些内容而必须复制它,则可能会卡住。作为子程序参数和子程序返回值,这两种方式都可以:
call_some_sub(\$big_text, \@long_array);
sub call_some_sub {
my($text_ref, $array_ref) = @_;
...
return \%hash;
}
☹追踪模块中的内存泄漏。直到我意识到a module wasn't releasing memory,我在应用程序中遇到了很大的问题。我在模块的RT队列中找到一个补丁,应用它,并解决了这个问题。
☹如果您需要处理一大块数据但不想占用内存占用量,请将工作转移到子进程。子进程在运行时只有内存占用。当你得到答案时,子进程关闭并释放内存。同样,工作分配系统(例如Gearman)可以在机器之间传播工作。
re将递归解决方案转换为迭代解决方案。 Perl没有尾递归优化,所以每个新的调用都会添加到调用堆栈中。您可以使用goto或模块的技巧自行优化尾部问题,但这需要很多工作来坚持您可能不需要的技术。
☹他使用6 Gb还是只使用了5个?那么,告诉你实情,在这种兴奋中,我有点失去了自己。但是,因为这是Perl,世界上最强大的语言,并且会打消你的记忆,所以你必须问自己一个问题:我感到幸运吗?那么,你好,朋克?
还有很多,但现在清晨才知道这些是什么。我在Mastering Perl和Effective Perl Programming中覆盖了一些。
这是一个非常宽泛的问题。如果您可以提供您正在尝试完成的一些任务,建议可能不会随机。 – 2012-03-16 09:22:23
我想你应该把你的其他问题分解成新的Stackoverflow问题。 – 2012-03-23 19:27:42
是的,我认为这会得到更好的回应,但是我在设置奖励后意识到。现在我不确定我会如何去做。是否有可能取消赏金?我不认为它是: -/ – GoldenNewby 2012-03-23 20:24:56