我有一个要求
我必须在内存中放置一个数据结构(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首选“写时复制”机制。
因此,如果您仅读取数据,则分叉的子进程将看到父进程的数据。
换句话说,可能不会浪费内存。