我正在尝试实现一个非常、非常大的字典搜索,以匹配PHP句子中的单词。我最初的想法是使用Aho-corasick算法,因为Aho-corasick解决了我的确切问题。我第一次用PHP实现了Trie。Trie在缓存时会产生足够快的字典;然而,它占用了大约3mb的内存。在PHP中,这不是很好的扩展。
显然,无论我们使用什么数据结构,一个大字典都会占用大量的内存。我只需要字典的一个实例,因为它是静态的,不需要重建。
如果这个对象可以在所有线程之间共享,那么3mb的内存是可以忽略不计的,但是,我不确定如何在PHP中的线程之间共享内存。
如何在HTTP请求之间共享此对象?当每个线程都需要仅由Trie创建的3mb开销时,我看不到项目的扩展。
发布于 2015-10-08 05:58:51
我写了(从APC和维护分叉) APCu:共享内存缓存不会对您有帮助。它们的内部存储区域已经有了定义的结构,您不能更改它。您可以将您的结构存储为对象,但是这些和其他值实际上是在PHP实例之间共享的。共享内存apc-类似于缓存,复制出每个请求值的上下文的共享内存。
我编写了p线程(PHP扩展):线程不会对您有帮助。就像APC必须从共享内存中复制一样,线程必须。
PHP一直都是不共享的,否则就会破坏一些东西。您可以编写看起来像是在共享内存的代码,但它不会是这样的;规则绝不能被打破。
我不认为PHP是一种明智的目标语言,如果一个主要的需求是效率,那么您似乎在第一段末尾就认识到了这一点。我可能错了,但鉴于上述所有事实,如果你不同意,我会感到惊讶的。
虽然这不是一种明智的语言,但它可以说是一个合理的平台。我将假设您希望在web应用程序上下文中使用它,并且目标是PHP,但更明智的做法是用合适的语言实现结构和算法,并通过扩展将其公开给web应用程序。
适合的语言通常是指PHP扩展的C或C++,但如果您有足够的创造性,则可以表示其他语言。
你仍然不能打破规则,但你不需要。
很明显,这取决于你做那些事情的能力。
发布于 2021-01-28 15:20:35
我不太确定我完全明白需要。
要在(同一客户端的)后续请求之间共享数据,可以使用会话或一些缓存。
要在后续请求(不是同一个客户端的请求)之间共享数据,可以使用一些缓存(Redis?)
要在多个线程之间共享数据(并在协同线程之间传递/持久化数据),您需要使用一个专用的多线程库(比如Swoole)来绕过PHP本身是单线程的事实。或者使用像RoadRunner这样的PHP平台来实现高效的复用,而不是php。
发布于 2015-10-07 18:14:24
您可以使用PThreads在php中执行多线程。
https://github.com/krakjoe/pthreads
它使用posix线程并提供同步、线程池和线程对象的读/写/可执行支持。
它运行在PHP7上。下面是一个具有两个计数器的程序,该程序异步运行。
<?php
$thread1 = new class extends Thread {
public function run() {
for ($i = 0; $i < 10000; $i++) {
echo "Hello thread1 ($i)\n";
}
}
};
$thread2 = new class extends Thread {
public function run() {
for ($i = 0; $i < 10000; $i++) {
echo "Hello thread2 ($i)\n";
}
}
};
$thread1->start() && $thread1->join();
$thread2->start() && $thread2->join();
?>https://stackoverflow.com/questions/32998800
复制相似问题