我正在编写一个培根类型的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,我只有4 GB的RAM。这需要花费一些时间来加载,似乎它可能会使服务器实例的数量低于其他情况。如果我理解正确,那么像这样的数据量大(而不是客户端交互很多)的任务通常会通过设置SQL数据库或所有服务器进程可以查询的类型的某种东西而与服务器分离。但我不知道一个符合我需求的数据库框架。
那么,如何进行?是否值得尝试设置与Web服务器脱离的数据库,或以其他方式将应用程序移动到比mod_wsgi更远的步骤,以便可能运行更多的服务器实例?如果是这样,怎么办呢?
我的第一印象是数据库而不是服务器始终是限制因素。看起来典型的Apache mpm_worker_module配置无论如何都有ServerLimit 16,所以我可能只会得到更多的服务器。如果我从服务器离开数据库,我也必须有一些方法来运行数据库的多个实例(我已经知道只有一个人可能会因为我想要的流量水平而削减它支持)并让他们与服务器玩得很好。所以我或许主要回答了我自己的问题,但这是一种奇怪的情况所以我认为值得一看,如果有人能够更坚定地处理它。我失踪了什么?这种实施有意义吗?提前谢谢!
技术细节:它是一个Django网站,我将在Ubuntu 10.4上使用Apache 2.2.14提供服务。
答案 0 :(得分:1)
首先,看看mod_wsgi的守护进程模式,不要使用嵌入式模式,因为你可以控制Apache子进程的Python WSGI应用程序进程的数量。其次,你最好把内存饥饿的位放在一个单独的后端进程中。您可以使用XML-RPC或其他消息队列系统与后端进程进行通信,甚至可以查看是否可以以某种方式使用Celery。