我有一个要求,其中
我必须在内存中放置一个数据结构(Perl哈希),这样每个HTTP进程(运行Perl脚本)都将使用该哈希。
哈希结构大约为300 MB。
环境是mod_perl
我想创建一个在Apache start加载的模块,它在共享区域中创建一个哈希并返回对它的引用。
您能否对此行为发表评论,或建议其他解决方案。另请指出一些好的资源来检查示例。
答案 0 :(得分:1)
如果在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时,操作系统更喜欢" Copy on Write"机制。 因此,如果您只读取数据,分叉子进程将查看父进程数据。 换句话说,可能没有浪费内存使用。
答案 1 :(得分:0)
我会考虑通过Storable
store
将其传递给文件,retrieve
在开始时。
如果需要更改,您需要使用flock
来仲裁IO,并且可能需要某种机制来检查它最后一次更改(例如检查mtime)。