我正在尝试实现一个非常非常大的字典搜索来匹配PHP中句子中的单词.我最初的想法是使用Aho-corasick算法,因为Aho-corasick解决了我的确切问题.我首先用PHP实现了一个Trie.Trie在缓存时会生成一个足够快的字典; 但是,它占用大约3mb的内存.这在PHP中无法很好地扩展.
显然,无论我们使用何种数据结构,大型字典都会占用大量内存.我只需要单个字典实例,因为它是静态的,不需要重建.
如果这个对象可以在所有线程之间共享,那么3mb的内存可以忽略不计,但是,我不确定在PHP中的线程之间共享内存的正确方法.
如何在HTTP请求之间共享此对象?当每个线程需要由Trie创建的3mb开销时,我看不到项目缩放.
我写的(从APC分叉并维护)APCu:共享内存缓存不会对你有所帮助.它们的内部存储区域已经有一个定义的结构,你不能改变它.您可以将结构存储为对象,但实际上在PHP实例之间共享这些,而没有其他值.共享内存apc类高速缓存,为请求值的每个上下文复制出共享内存.
我写了pthreads(PHP扩展):线程不会帮助你.就像APC必须复制共享内存一样,线程必须.
PHP一直没有任何共享,否则你会破坏东西.您可以编写看起来像共享内存的代码,但它不会; 绝不能打破规则.
如果主要要求是效率,我认为PHP不是一种明智的目标语言,你似乎在第一段末尾就认识到了这一点.我对此可能是错的,但是如果你不同意,我会对上述所有事实持怀疑态度.
虽然它不是一种明智的语言,但它是一个可以理解的合理平台.我将假设您希望在Web应用程序上下文中使用它,因此针对PHP,但更明智的做法是使用合适的语言实现结构和算法,并将其公开给您通过扩展程序的Web应用程序
对于PHP扩展,合适的语言通常意味着C或C++,但如果您具有足够的创造性,则可能意味着其他语言.
你仍然无法违反规则,但你不需要.
显然,这取决于你做这些事情的能力.