2014-09-05 66 views
0

我使用PHP來做大量的數據處理(意識到我可能會進入我應該使用其他語言和/或技術的領域)。我可以在PHP進程之間共享內存中的大數組嗎?

我正在做一個PHP進程的實體提取,加載一個包含ngrams的數組以查找內存。該陣列使用3GB內存,每次啓動進程時需要大約20秒的時間才能加載。我在機器上本地生成一次,每個進程都從.json文件加載它。每個進程然後標記它正在處理的文本,並在這兩個數組之間進行array_intersect以提取實體。

有沒有什麼辦法可以在運行所有這些進程的計算機上將它預加載到內存中,然後在所有進程間共享資源?

因爲它可能不適用於PHP:我應該研究哪種類型的語言/方法來更有效地進行這種實體提取?

+1

我會從內存中的數據庫解決方案開始。 – raina77ow 2014-09-05 21:20:05

+0

在包含這些ngram的MEMORY表中的MySQL中查找查找速度是否與PHP中的數組查找速度相當?這可能是...不知道,直到你測試它......情況。 – 2014-09-05 21:22:24

回答

1

如果數組在加載後永遠不會被修改,那麼您可以使用pcntl_fork()並分離出一堆腳本副本。使用寫時複製語義,他們都將從陣列的完全相同的內存副本中讀取數據。

但是,一旦數組被修改,那麼當數組被複制到每個分叉的子內存空間時,您將付出巨大的代價。如果任何腳本提早完成運行,這將是特別真實的 - 它們會關閉,PHP進程開始關閉清理,並且這會被視爲寫入陣列的內存空間,導致複製。

1

就你而言,最好的共享方式可能是只讀mmap訪問

我不知道這是否可能在PHP中。許多語言將允許您將文件映射到內存中 - 並且您的操作系統將足夠聰明,以實現只讀地圖可以共享。另外,如果您不需要全部,則操作系統可以回收內存,並根據需要從磁盤再次加載它。事實上,它甚至可以讓你映射比你身體更多的內存。

mmap真的很優雅。但是,在PHP中處理這樣的映射數據可能會很痛苦,而且很慢。一般來說PHP很慢。在基準測試中,通常看到PHP以40-50倍的優秀C程序的運行時間進入。這比例如Java,一個好的Java程序只比高度優化的C慢兩倍;在那裏它可能會得到有力的Java開發工具,而不必調試低級C代碼。但是PHP沒有任何關鍵的好處:它既不優雅,也沒有優秀的工具鏈,也不是很快...

相關問題