johnl has asked for the wisdom of the Perl Monks concerning the following question:

I've got a perl web site that loads a huge number of hashes before it starts doing anything. This translates into a real lag in performance.
Can anyone think of a way that I can get apache to hold these hashes so that they are available to any perl process running under apache? Thanks in advance John

Replies are listed 'Best First'.
Re: Move perl variables to apache
by Joost (Canon) on Jun 18, 2004 at 17:21 UTC
    If you are using mod_perl, you could set the hashes in (a module use'd in) the startup.pl script, thereby sharing it with all apache childs. If you change the hashes afterwards, they won't be shared anymore - assuming Unix copy-on-write mechanisms apply; i.e. you're using a forked apache - I don't know what the deal is with data sharing on apache 2 with threads.

    Otherwise, you might want to take a look at Cache::Cache or IPC::ShareLite.

    Update: I just remembered DBM::Deep, which might be easier to merge into your existing code. Never really tested it, though the documentation looks very promising.

    Hope this helps,
    Joost.

Re: Move perl variables to apache
by shemp (Deacon) on Jun 18, 2004 at 17:27 UTC
    I agree with using mod_perl as was previously mentioned. You may also want to look at various Tie'd hashes that pretty much leave the hash on disk, but after tie'ing, the tied hash behaves like any other hash in your program.

    Caveat: i am not sure about thread safety with any of the disk bound tied hash modules. If you're just reading info, you're probably ok. If you're modifying data in these hashes, you've probably already dealt with thread safety.
Re: Move perl variables to apache
by johnl (Initiate) on Jun 18, 2004 at 17:33 UTC
    Looks like my answer lies in your comments! Thanks!