分叉和内存分配问题

我已经inheritance了一个Perl脚本,它运行在一个基本上抓取一堆URL的数据(又名刮)的EC2实例上。 这个脚本被调用的方式是通过一个shell脚本来分派多个perl脚本。 可能有数百个Perl脚本在任何给定的点上运行,具体取决于抓取进度。

每个Perl脚本都这样做:

## create a temporary hash to hold everything ## my %products = (); 

正如你可以想象的那样,随着更多的产品在这个过程中被刮掉,这个数组也随之增长。

我的问题是:当perl尝试将下一个产品添加到“product”数组并且没有可用内存时会发生什么? 它只是等待还是死亡? 我的直觉告诉我,它死了,但我怎么能使用一个malloc风格的内存分配,如果它不能分配它等待的内存?

限制subprocess的数量是更好的吗?

任何想法将不胜感激。

ps这是perl,v5.10.1(*)为i486-linux-gnu-thread-multi构build的

不确定Perl的具体情况,但在其他dynamic语言(如Python)中,您会得到一个内存分配失败和随后的程序崩溃。 一些语言(包括Python)允许你为条件安装一个处理程序,Perl可能也是这样。

我不知道你在哪里得到这个想法,当malloc不能分配内存的时候,Linux的实现或者返回一个指针,或者在请求失败的时候返回NULL。

由于Linux默认允许内存过度分配,Linux上的情况更加复杂。 例如,如果你的系统有4GB的可用虚拟内存,你可以让多个进程分配近4GB的内存。 直到他们弄脏了内存实际使用的分配。 如果多个进程结束这样做,他们将耗尽实际可用的内存,并且内存不足杀手进程将踢入并杀死一些进程。

对你来说简单的解决scheme就是看你的进程使用多less内存,并且只允许一次运行一定数量的内存。 更复杂的解决scheme涉及使用固定长度的数据结构,以便知道内存使用情况,或者直接或通过缓冲区将结果stream式传输到磁盘以保持较低的使用率。 解决scheme实际上取决于应用程序,如果没有其function的细节,很难提出更具体的内容。