我有一个要求


我必须在内存中放置一个数据结构(Perl哈希),以便每个HTTP进程(运行Perl脚本)都将使用该哈希。
哈希结构约为300 MB。
环境是mod_perl


我想到了创建一个要在Apache启动时加载的模块,该模块在共享区域中创建哈希并返回对其的引用。

您能否对此行为发表评论,或提出其他解决方案。另外,请指向一些好的资源来检查示例。

最佳答案

如果您将大量的散列数据放在mod_perl内存中,
然后mod_perl父进程在服务器启动阶段读取它。

首先,在Your/HugeData.pm目录上创建@INC

package Your::HugeData;

our %dictionary = (
    ....
);


接下来,apache进程在启动时读取该信息。

# In apache.conf (or anywhere apache config file)
PerlModule Your::HugeData


然后,您的脚本可以使用%Your::HugeData::dictionary作为包变量。

# In mod_perl handler script or ModPerl::Registry (CGI emulate) script.
use Your::HugeData;
...
my $tokyo = $Your::HugeData::dictionary{tokyo};


在Linux Apache上使用prefork MPM时,OS首选“写时复制”机制。
因此,如果您仅读取数据,则分叉的子进程将看到父进程的数据。
换句话说,可能不会浪费内存。

10-07 15:02