2

我正在编写一个培根类型的 Oracle 网站,该网站涉及在一个非常大的有向图(> 500 万个节点,每个节点平均可能有 30 个出站边)上进行广度优先搜索。除了显示几个主要是文本页面(它是如何工作的、联系信息等)之外,这基本上也是该网站要做的所有事情。我目前有一个在 Python 中运行的测试实现,但即使使用 Python 数组来有效地表示数据,它也需要 >1.5gb 的 RAM 来保存整个东西。显然,对于像这样的低级算法问题,Python 是错误的语言,所以我计划使用 Python/C 绑定在 C 中重写大部分。我估计这将需要大约 300 mb 的 RAM。

根据我目前的配置,这将通过 apache 2.2.14 中的 mod_wsgi 运行,它被设置为使用 mpm_worker_module。然后,每个子 apache 服务器将加载整个 python 设置(加载 C 扩展),因此使用 300 mb,而我只有 4gb 的 RAM。这需要一些时间来加载,而且似乎它可能会使服务器实例的数量低于其他情况。如果我理解正确的话,像这样的数据繁重(而不是客户端交互繁重)的任务通常会通过设置 SQL 数据库或所有服务器进程随后可以查询的某种东西与服务器分离。但我不知道适合我需要的数据库框架。

那么,如何进行呢?是否值得尝试建立一个与网络服务器分离的数据库,或者以其他方式将应用程序移动到比 mod_wsgi 更远的一步,以便运行更多的服务器实例?如果是这样,如何做到这一点?

我的第一印象是数据库,而不是服务器,总是会成为限制因素。看起来典型的 Apache mpm_worker_module 配置无论如何都有 ServerLimit 16,所以我可能只会获得更多的服务器。而且,如果我确实将数据库与服务器分离,我还必须有某种方法来运行数据库的多个实例(我已经知道,对于我想要支持的流量级别,只有一个可能不会削减它)和让他们在服务器上玩得很好。所以我可能大部分都回答了我自己的问题,但这是一种奇怪的情况,所以我认为如果有人能更坚定地处理它,那将是值得一看的。有什么我想念的吗?这个实现有意义吗?提前致谢!

技术细节:这是一个 Django 网站,我将在 Ubuntu 10.4 上使用 Apache 2.2.14 提供服务。

4

1 回答 1

1

首先,查看 mod_wsgi 的守护程序模式,不要使用嵌入式模式,因为这样您可以单独控制 Apache 子进程的 Python WSGI 应用程序进程的数量。其次,您最好将内存不足的位放在单独的后端进程中。您可能会使用 XML-RPC 或其他消息队列系统与后端进程进行通信,或者甚至可能看看您是否可以以某种方式使用 Celery。

于 2012-04-04T22:17:08.380 回答