2009-07-08 33 views
4

放弃我的潜伏者地位,最后问一个问题...如何提高PHP的XML加载时间?

我需要知道如何改进从XML文件中绘制其数据的PHP脚本的性能。

一些背景资料:

  • 我已经映射瓶颈,CPU - 但要采取击中处理器成本之前优化脚本的性能。具体来说,脚本中占用CPU最多的部分是XML加载。

  • 我使用XML来存储对象数据,因为数据需要通过浏览器的Flash界面访问的原因,我们希望在这方面提供快速的用户访问。虽然这个项目还处于早期阶段,但如果最好的做法是放弃XML,那也是一个很好的答案。

  • 大量数据:目前绘制大约100k个对象,虽然通常是小对象 - 并且它们必须全部纳入脚本中,可能有少数例外。数据集只会随着时间而增长。

  • 频繁运行:理想情况下,我们运行脚本〜一小时50K倍;实际上,我们会达到〜1k/h的运行时间。这与数据大小相结合使得性能优化变得非常重要。

  • 已经采取了对相同数据进行多次运行而不是每次运行加载的优化步骤,但仍需要很长时间。这些运行通常应该使用“新鲜”数据和用户完成的修改。

回答

3

只是为了阐明:您正在加载的数据来自XML文件以当前状态进行处理,并且在发送到Flash应用程序之前进行了修改?

它看起来就像你使用一个数据库来存储数据,并推出XML根据需要,而不是首先在XML阅读它会更好;如果构建XML文件变得缓慢,则可以在生成文件时缓存文件,以避免冗余生成相同的文件。每小时

+0

这就是我正在建议的。 +1 – ceejayoz 2009-07-08 14:41:07

+0

是的,100k对象最好保存在嵌入式数据库中,或者如果您可以访问它,则可以使用专用的对象;那么你可以只生成客户端需要的xml位。 – 2009-07-08 15:49:14

1

如果XML保持相对静态的,你可以缓存它作为一个PHP数组,像这样:

<xml><foo>bar</foo></xml> 

在一个文件中缓存为

<?php return array('foo' => 'bar'); 

它应该是更快的PHP只包括XML的数组版本。

+0

这是一个很好的答案,但我们已经在同时进行多次运行;预计XML不会在几秒钟内保持特别的静态,但我们允许几分钟的更改,以便稍后跳过。之后,我们必须完成所有更改,这意味着重新创建阵列。仍然非常密集的CPU。 – Polymeron 2009-07-08 17:15:37

0

〜1K /小时3600秒,第二(更不用说50K /小时)超过3个奔跑......

有很多问题。其中一些是:

  • 您的php脚本是否需要读取/处理每次运行的数据源的所有记录?如果不是,它需要什么类型的子集(〜大小,标准......)
  • 同样的问题为Flash应用程序+谁发送数据? PHP脚本? “直接”请求完整的静态xml文件?
  • 对数据源执行哪些操作?
  • 你需要某种并发机制吗?
  • ...

而只是因为你想的XML数据传送到闪存的客户并不一定意味着你必须将XML数据存储在服务器上。如果例如客户端只需要一小部分availabe记录,它可能快很多,不会将数据存储为xml,但更适合于加速和“可搜索性”,然后在动态创建子集的xml输出,也许取决于客户端请求的数据以及数据如何/多少发生变化,由一些缓存协助。

编辑:假设您确实需要整个数据集并需要连续模拟。然后,您可能需要考虑一个持续的过程,该过程将完整的“世界模型”保存在内存中,并在每次运行(世界节拍)时在此模型上运行。这样至少你不必在每次打勾上加载数据。但是这样的过程通常是用别的东西写的。

相关问题