我可以在PHP进程之间共享内存中的大型数组吗?

时间:2014-09-05 21:15:53

标签: php nlp data-mining text-extraction n-gram

我使用PHP进行大量数据处理(意识到我可能会进入我应该使用其他语言和/或技术的领域)。

我正在使用PHP进程进行实体提取,该进程加载包含ngrams的数组以查找内存。该阵列使用3GB内存,每次启动进程大约需要20秒。我在机器上本地生成一次,每个进程从.json文件加载它。然后,每个进程都会对其处理的文本进行标记,并在这两个数组之间执行array_inters来提取实体。

有没有办法在运行所有这些进程的机器上将其预加载到内存中,然后在所有进程中共享资源?

因为PHP可能不可能:我应该研究哪种类型的语言/方法来更有效地进行这种实体提取?

2 个答案:

答案 0 :(得分:1)

如果数组在加载后永远不会被修改,那么你可以使用pcntl_fork()并分出一堆脚本副本。使用copy-on-write语义,他们都可以从数组的完全相同的内存副本中读取。

然而,一旦数组被修改,那么当数组被复制到每个分叉的子存储空间时,你将付出巨大的代价。如果任何脚本提前完成运行 - 它们将关闭,PHP进程启动关闭清理,并且这被视为对阵列内存空间的写入,则尤其如此。导致复制。

答案 1 :(得分:1)

在您的情况下,最佳共享方式可能是只读mmap访问

我不知道这是否可以在PHP中使用。许多语言允许您将文件映射到内存中 - 并且您的操作系统将足够智能以实现可以共享只读映射。此外,如果您不需要所有内容,操作系统可以回收内存,并根据需要从磁盘重新加载内存。事实上,它甚至可以让你绘制比实际更多的内存。

mmap非常优雅。但是,在PHP中处理这样的映射数据可能会很痛苦,而且很少。一般来说,PHP很慢。在基准测试中,通常会看到PHP的运行时间是好C程序的40-50倍。这比例如Java,优秀的Java程序只有高度优化的C的两倍;拥有强大的Java开发工具而不必调试低级C代码可能会有所回报。但PHP并没有任何关键的好处:它既不优雅,也不优越,也不是很快......