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

问题描述:

我使用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

如果数组在加载后永远不会被修改,那么您可以使用pcntl_fork()并分离出一堆脚本副本。使用写时复制语义,他们都将从阵列的完全相同的内存副本中读取数据。

但是,一旦数组被修改,那么当数组被复制到每个分叉的子内存空间时,您将付出巨大的代价。如果任何脚本提早完成运行,这将是特别真实的 - 它们会关闭,PHP进程开始关闭清理,并且这会被视为写入阵列的内存空间,导致复制。

就你而言,最好的共享方式可能是只读mmap访问

我不知道这是否可能在PHP中。许多语言将允许您将文件映射到内存中 - 并且您的操作系统将足够聪明,以实现只读地图可以共享。另外,如果您不需要全部,则操作系统可以回收内存,并根据需要从磁盘再次加载它。事实上,它甚至可以让你映射比你身体更多的内存。

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