2014-12-02 38 views
3

使用共享存儲器I有一個要求,其中在mod_perl的環境

  1. 我必須把一個數據結構(Perl的散列)在存儲器中,使得每個HTTP處理(運行Perl腳本)將使用該散列。

  2. 哈希結構約爲300 MB。

  3. 環境是mod_perl的

我想創建模塊在創建中的共享區域的散列,並返回對它的引用的Apache開始加載的。

您可以對行爲發表評論,或者提出其他解決方案。也請指出一些很好的資源來檢查例子。

+0

雖然你可能會得到有用的答案,但你的問題太廣泛了。您現在知道堆棧溢出是關於回答*特定的*編程問題。 – Borodin 2014-12-02 10:17:55

+1

Ogata Tetsuji的回答似乎是解決問題的一個聰明辦法,但實際上,我必須退後一步並重新考慮問題。這是通過將大數據結構存儲在Perl過程之外的更常見的問題,例如,與數據庫或某種文件結構。即使您使用傳統的SQL數據庫,數據也會很快移到操作系統磁盤緩存中,查詢時間變得非常快。您也可以查看內存數據存儲,如Memcached,這將提供有競爭力的響應時間。 – ratsbane 2015-02-17 17:39:27

回答

0

我會考慮通過Storablestore把它交給一個文件,retrieve它在開始。

如果需要更改,您需要使用flock來仲裁IO,並可能使用某種機制來檢查最後一次更改(例如,檢查mtime)。

1

如果你將大量散列數據放在mod_perl內存上,那麼mod_perl父進程會在服務器啓動階段讀取它。

首先,您在@INC目錄中創建Your/HugeData.pm

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更喜歡「Copy on Write」機制。 如果您只讀取數據,那麼分叉的子進程會查看父進程的數據。 換句話說,可能沒有浪費內存使用。

+0

小心引用子進程中的共享數據 - 這相當於頁面上的「寫入」。 你可以在這裏閱讀一個具體的例子:https://retout.co.uk/blog/2012/12/21/ – ashley 2016-03-24 14:22:12