如何使用 PHP 和 C 将大图保存在内存中


How to keep large graph in memory with PHP and C?

我需要创建一个Web应用程序,除了其他东西之外,它还会对大型图形(数据结构(进行查询。我将只在图上运行 Dijkstra 或 A* 算法,并将最短路径作为服务器响应返回给用户(可能是 JSON 格式(。但是该图非常大,每次当用户查询从 A 点到 B 点的最短路径时构建它的效率不是很高。我需要找到一种方法来将图形保存在内存中。

所以,我正在考虑制作一个 C 程序,我将运行一次,它将构建图形,然后打开服务器套接字并开始侦听某个端口。然后在PHP中,我将通过套接字连接到该程序,发送点A和B并等待响应。

但我不确定这个解决方案有多好...还有其他更好、更优雅的解决方案吗?我没有特别的理由建议用 C 制作独立的程序来构建图形,只是我用 C 比用 PHP 编写它更舒服,而且 C 比 PHP 快得多(据我所知,今天可能不是真的(。

我正在考虑制作一个 C 程序,我将运行一次,它会 构造图形,然后打开服务器套接字并开始侦听 某个端口。

这种方法是完全有效的,但它增加了路径查找程序的复杂性和系统部署的复杂性。

实际上,您可以使用PHP对其进行编程,并使用serialize()将对象或任何中间结果以序列化格式存储。但是,如果您的对象非常大,这可能不具有 CPU 效率。

除了使用侦听应用程序或PHP代码之外的第三种方法可能是编译的PHP扩展(在C/C++中(,这比PHP代码更有效的CPU和内存。同时,您可以在系统的静态文件中构建自己的搜索树或索引。但是,这些对象仍然不是持久性的。

最后,您可以随时使用 PHP 而不是 C 构建侦听服务,使用套接字方法 http://php.net/manual/en/sockets.examples.php。它仍然可以保留对象,并且程序会话不会结束。

您应该能够根据应用程序的性质(内存、CPU 和逻辑复杂性(做出自己的选择。