保持Perl内存使用率低的提​​示

Gol*_*wby 48 memory perl

在Perl脚本中保留较低内存使用率的一些好技巧是什么?我有兴趣学习如何根据Perl程序为系统保持尽可能低的内存占用.我知道Perl在内存使用方面不是很好,但我想知道是否有改进它的提示.

那么,你可以做些什么来保持Perl脚本使用更少的内存.我对任何建议感兴趣,无论它们是编写代码的实际技巧,还是如何以不同方式编译Perl的技巧.

编辑为Bounty: 我有一个perl程序,用作网络应用程序的服务器.连接到它的每个客户端当前都会获得它自己的子进程.我也使用过线程而不是forks,但我还是无法确定使用线程而不是forks实际上是更高效的内存.

我想尝试再次使用线程而不是forks.我相信理论上应该节省内存使用量.我在这方面有几个问题:

  1. 在Perl中创建的线程是否会阻止将Perl模块库复制到每个线程的内存中?
  2. 线程(使用线程)的最有效的方式(或唯一的)在Perl来创建线程?
  3. 在线程中,我可以指定一个stack_size参数,在指定这个值时我应该考虑什么,以及它如何影响内存使用?

使用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 PerlEffective Perl Programming中的一些内容.

  • IIRC,内存不会从程序中释放出来,但程序本身将重用已经声明的内存.因此,如果你的哈希超出范围,然后你创建一个新哈希,它可能会使用与旧哈希相同的内存(许多警告,但足够接近).此外,IIRC这不是特定于Perl的问题,而是基本上操作系统将内存分配给程序的方式. (6认同)
  • "Perl没有尾递归优化" - 我认为这就是goto&foo; 确实.还有[Sub :: Call :: Tail](http://search.cpan.org/perldoc?Sub::Call::Tail)模块. (3认同)
  • 此外,我认为Reini Urban可能是要求更低内存Perling的更深层次的人.如果你胆敢的话,请查看他的[技术博客](http://blogs.perl.org/users/rurban/). (2认同)