linux perl占用大量资源_保持Perl内存使用量的提示

您遇到什么问题,“大”对您意味着什么? 我有朋友,您需要将200 Gb文件加载到内存中,所以他们的小技巧与预算购物者有很大不同,因为预算最少的VM切片使用250 Mb的RAM(真的吗?我的手机还提供了更多的东西)。

通常,Perl会保留您使用的任何内存,即使它没有使用它也是如此。 实现一个方向的优化,例如 内存可能会对速度产生负面影响。

这不是一个完整的列表(Perl编程中还有更多内容):

☹使用Perl内存分析工具来帮助您查找问题区域。 请参阅分析Perl程序上的堆内存使用情况,以及如何在Perl中查找哈希所占用的物理内存量?

☹使用可能范围最小的词法变量,以允许Perl在不需要内存时重新使用该内存。

☹避免创建大型临时结构。 例如,读取具有foreach的文件可一次读取所有输入。 如果仅逐行使用它,请使用while。

foreach ( ) { ... } # list context, all at once

while( ) { ... } # scalar context, line by line

might您甚至可能不需要将文件存储在内存中。 内存映射文件,而不是对其进行处理

☹如果需要创建大数据结构,请考虑使用诸如DBM :: Deep或其他存储引擎之类的方法,以将其大部分保留在RAM和磁盘上,直到需要时再使用。

☹不要让别人使用您的程序。 无论何时,我都会将内存占用量减少约100%。 它还减少了支持请求。

reference通过引用传递大量文本和较大聚合,这样您就不必进行复制,因此可以将相同的信息存储两次。 如果由于要更改某些内容而必须复制它,则可能会卡住。 这既可以作为子例程参数,也可以作为子例程返回值:

call_some_sub( \$big_text, \@long_array );

sub call_some_sub {

my( $text_ref, $array_ref ) = @_;

...

return \%hash;

}

☹跟踪模块中的内存泄漏。 在意识到模块没有释放内存之前,我在应用程序方面遇到了大问题。 我在模块的RT队列中找到了补丁,将其应用并解决了问题。

☹如果您需要一次处理大量数据,但又不想占用持久的内存,则将工作分担给子进程。 子进程在工作时仅具有内存占用量。 当您得到答案时,子进程将关闭并释放其内存。 同样,诸如Gearman之类的工作分配系统也可以在机器之间分配工作。

☹将递归解决方案转换为迭代解决方案。 Perl没有尾部递归优化,因此每个新调用都会添加到调用堆栈中。 您可以使用goto或模块的技巧自己优化尾部问题,但这要依靠一项您可能不需要的技术需要进行大量工作。

he他使用6 Gb还是仅使用5 Gb? 好吧,说实话,在所有这些激动中,我有点迷失了自己。 但是因为这是Perl(世界上最强大的语言),并且会吹走记忆,所以您必须问自己一个问题:我感到幸运吗? 好吧,朋克吗?

还有更多,但是现在还不为时过早。 我将在精通Perl和有效Perl编程中介绍一些内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值