长期运行的统计过程 - 对语言选择的看法?

时间:2010-04-15 18:16:26

标签: java php python statistics long-running-processes

我正在管理我所管理的网站的LAMP堆栈。需要汇总使用情况统计信息(与我们的桌面产品相关的各种事项)。

我最初用PHP解决了这个问题(因为我已经有了很多类来处理数据)。一切都在我使用5.3的开发盒上运行良好。

长话短说,5.1内存管理似乎糟糕得多,而且我不得不做很多愚弄让长期累积脚本在固定内存空间中运行。我们的服务器人员此时不愿意升级PHP。我已经将我的dev服务器移回了5.1,所以我不再遇到这个问题。

为了挖掘MySQL数据库以汇总不同时期和分辨率的统计数据,可能会运行一个在将来一直这样做的过程(而不是在cron时间表上),您建议使用哪种语言选择?我正在看Python(我或多或少知道),Java(不太了解它),或者用PHP来解决它(非常清楚)。


编辑:评论者的设计说明

解决方案:汇总脚本当前的工作方式是,我有一些用于定义分辨率和存储桶的类。我有年,月,周,日 - 给定一个“桶号”,每个类给出一个开始和结束时间戳,定义该桶的时间范围 - 这是基于任意的纪元日期。系统维护“完整”记录,即它将完成自上次运行以来每个分辨率的累计数据集。

SQL Strat:基本统计信息位于许多不同的模式和表中。我对大部分的每个卷起的统计数据进行单独查询,然后填写一条记录以进行插入。您建议使用嵌套子查询,例如:

INSERT到rolled_up_stats(someval,someval,someval,...)VALUES(来自someschema的SELECT SUM(somestat),来自someschema2的SELECT AVG(somestat2))

那些子查询会生成临时表,对吧?我的经验是,过去糖蜜一直很慢。这是一种更好的方法吗?

编辑2:为问题添加一些内联回复

语言是5.1 php的一个瓶颈 - 我基本上被告知我选择了错误的语言(虽然这些脚本在5.3上运行良好)。你提到python,我正在检查这个任务。为了清楚起见,我正在做的是为桌面产品的使用统计提供管理工具(日志实际上是由EJB服务器写入mysql表)。我做了apache日志文件分析,以及更多Web界面的自定义Web报告,但这个项目是分开的。到目前为止我采用的方法是聚合表。我不确定这些消息队列产品能为我做些什么,我来看看。

更进一步 - 数据用于绘制服务和客户级别的活动,以便管理层了解产品的使用方式。您可以选择一个时间段(4月1日到4月10日),并根据所选的时间段检索不同粒度(小时,天,月等)的特定功能的总使用分钟数。它基本上是对使用情况的事后分析。然而,这种需求似乎趋于实时化(查看最后一小时的使用情况)

3 个答案:

答案 0 :(得分:1)

我曾经在一个项目上做过类似的事情,所以我有实际的表现经验。您很难击败“INSERT ... SELECT”(不是“INSERT ... VALUES(SELECT ...)”的表现。请参阅http://dev.mysql.com/doc/refman/5.1/en/insert-select.html

优点是,如果你这样做,特别是如果你在MySQL程序中保留汇总代码,那么你需要从外部获得的只是一个cron-job,它可以让数据库执行正确的汇总在适当的时候 - 就像带有'mysql <correct DB arguments etc.> "CALL RollupProcedure"'

的shell脚本一样简单

通过这种方式,您可以保证自己零内存分配错误,并且当MySQL数据库位于单独的计算机上时没有良好的性能(不会跨越机器边界移动数据......)

编辑:每小时的分辨率很好 - 只需每小时运行一次cron-job ......

答案 1 :(得分:1)

这个问题有很多不同的方法,其中一些在这里提到,但是你对汇总数据的处理方式还不清楚......?

如果您想利用这些数据在您的网站上提供类似Digg的“X diggs”按钮,或者摘要图表或某些需要在某种持续基础上提供的按钮,您实际上可以使用memcache ,并让您的代码通过在适当的时间递增它来使特定统计信息的缓存密钥保持最新。

您还可以在数据库中保留聚合表,这可以很好地用于更复杂的报告。在这种情况下,根据您拥有的数据量和需求量,您可以使用每小时表,然后根据该基表创建视图以表示天,周等。

如果您有大量数据,并且需要聚合表,则应该考虑将统计信息收集(可能还有数据库查询本身)卸载到像RabbitMQ或ActiveMQ这样的队列中。在队列的另一端放置一个只是坐着并运行的消费者守护程序,根据需要更新数据库(可能还有缓存)中的内容。

您可能还会考虑的一件事是您的Web服务器日志。我已经看到了这样的实例,在对配置中的日志格式规则进行微调之后,我能够从Web服务器日志本身获得大部分所需的统计信息。您可以每次滚动日志,然后开始脱机处理它们,将结果记录在报告数据库中。

我已经用Python完成了所有这些事情(我发布了loghetti来处理Apache组合格式日志,特别是),尽管我不认为语言是限制因素或瓶颈。 Ruby,Perl,Java,Scala甚至awk(在某些情况下)都可以工作。

答案 2 :(得分:0)

如果您主要运行SQL命令,为什么不在命令行上使用MySQL等?您可以创建一个列出聚合数据的简单表,然后运行mysql -u[user] -p[pass] < commands.sql之类的命令,从文件中传入SQL。

或者,将工作拆分为较小的块并按顺序运行(如果这是最简单的PHP文件)。

如果你真的需要它是一个持续长时间运行的过程,那么像python或java这样的编程语言会更好,因为你可以创建一个循环并让它无限期地运行。 PHP不适合这种事情。将任何PHP类转换为Java都很容易。

相关问题