在Perl脚本中保留较低内存使用率的一些好技巧是什么?我有兴趣学习如何根据Perl程序为系统保持尽可能低的内存占用.我知道Perl在内存使用方面不是很好,但我想知道是否有改进它的提示.
那么,你可以做些什么来保持Perl脚本使用更少的内存.我对任何建议感兴趣,无论它们是编写代码的实际技巧,还是如何以不同方式编译Perl的技巧.
编辑为Bounty: 我有一个perl程序,用作网络应用程序的服务器.连接到它的每个客户端当前都会获得它自己的子进程.我也使用过线程而不是forks,但我还是无法确定使用线程而不是forks实际上是更高效的内存.
我想尝试再次使用线程而不是forks.我相信理论上应该节省内存使用量.我在这方面有几个问题:
使用Perl/Linux中的线程,在每个线程的基础上确定实际内存使用情况的最可靠方法是什么?
bri*_*foy 80
你遇到了什么样的问题,"大"对你意味着什么?我有朋友你需要将200 Gb文件加载到内存中,所以他们的好提示想法与预算购物者有很大不同,因为最小的VM片有250 Mb的RAM(真的吗?我的手机有更多).
通常,Perl会保留您使用的任何内存,即使它没有使用它.意识到在一个方向上进行优化,例如内存,可能会对另一个方向产生负面影响,例如速度.
这不是一个全面的列表(在Perl编程中还有更多):
☹使用Perl内存分析工具来帮助您找到问题区域.请参阅在perl程序上分析堆内存使用情况以及如何在Perl 中查找散列占用的物理内存量?
☹使用可能范围最小的词法变量,以允许Perl在您不需要时重新使用该内存.
☹避免创建大型临时结构.例如,读取一次foreach读取所有输入的文件.如果您只需要逐行使用,请使用while.
foreach ( <FILE> ) { ... } # list context, all at once
while( <FILE> ) { ... } # scalar context, line by line
Run Code Online (Sandbox Code Playgroud)
☹您甚至可能不需要将文件存储在内存中.内存映射文件而不是啜饮它们
☹如果您需要创建大数据结构,请考虑使用DBM :: Deep或其他存储引擎,以便将大部分内容从RAM和磁盘中保留下来,直到您需要它为止.
☹不要让人们使用你的程序.每当我这样做,我都会将内存占用减少大约100%.它还减少了支持请求.
☹通过引用传递大块文本和大聚合,这样就不会复制,因此会存储两次相同的信息.如果你因为想要改变某些东西而必须复制它,那么你可能会陷入困境.这可以作为子例程参数和子例程返回值的两种方式:
call_some_sub( \$big_text, \@long_array );
sub call_some_sub {
my( $text_ref, $array_ref ) = @_;
...
return \%hash;
}
Run Code Online (Sandbox Code Playgroud)
☹追踪模块中的内存泄漏.在我意识到模块没有释放内存之前,我遇到了应用程序的大问题.我在模块的RT队列中找到了一个补丁,应用它并解决了问题.
☹如果您需要处理大量数据但不想持久内存占用,请将工作卸载到子进程.子进程在其工作时仅具有内存占用.当您得到答案时,子进程将关闭并释放内存.类似地,诸如Gearman之类的工作分配系统可以在机器之间传播工作.
☹将递归解决方案转换为迭代解决方案.Perl没有尾递归优化,因此每个新调用都会添加到调用堆栈中.你可以通过goto或模块的技巧自己优化尾部问题,但是要做一些你可能不需要的技术还有很多工作要做.
☹他使用6 Gb还是仅使用5 Gb?好吧,说实话,在所有这些兴奋中,我有点迷失自己.但是,因为这是世界上最强大的语言Perl,并且会让你的记忆清醒,你必须问自己一个问题:我是否感到幸运?好吧,你做朋克吗?
还有更多,但是早上太早才弄明白这些是什么.我介绍了Mastering Perl和Effective Perl Programming中的一些内容.