2009-07-08 57 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輸出,也許取決於客戶端請求的數據以及數據如何/多少發生變化,由一些緩存協助。

編輯:假設您確實需要整個數據集並需要連續模擬。然後,您可能需要考慮一個持續的過程,該過程將完整的「世界模型」保存在內存中,並在每次運行(世界節拍)時在此模型上運行。這樣至少你不必在每次打勾上加載數據。但是這樣的過程通常是用別的東西寫的。

相關問題