2014-04-22 49 views
-1

我有一個很大的腳本,我們運行很多。以下是使用的算法:PHP極大地加快了我的腳本執行時間

  1. 從數據庫加載4500行並將它們存儲爲數組。 (A)

  2. 從數據庫加載600000行並將它們存儲爲數組。 (B)

  3. 對於(A)中的每個元素尋找(B)中的匹配。

  4. 轉到下一個元素(A)

所以這個腳本的迭代的最大數量是4500 * 60 000這是2.7億,所以你知道,這是PHP有點出汗。

我能否以某種方式使此過程更高效? 從數據庫讀取行並不是一個真正的問題,它是數組迭代會帶來很高的成本。

它確實工作得很快,但是在未來幾年中,一個因素(60000)將會大大增加。

那麼有什麼想法?

+3

向我們提供您的查詢。我想你可以用純SQL來做到這一點。 – Jurik

+1

SQL加入任何人......?我們沒有足夠的信息來詳細優化任何內容。也許你真的*需要*迭代所有這些數組。也許你沒有。我們不知道。 – deceze

+0

除了尋找A和B之間的匹配之外,可以通過重寫SQL查詢來處理它們。如果找到或未找到匹配,你實際上做了什麼? –

回答

1

以下是幾個不同的答案。我的猜測是,第一個是正確的,容易和充足,但很難確定。

可能的答案1:使用SQL

正如評論指出這聽起來非常非常像一個連接。此外,您的帖子似乎是 ,表示您只在發現匹配時採取行動,並且A中的每個元素 都不匹配。這意味着你的SQL語句只應該返回匹配的行,而不是所有的行都是 。不要緊,你不能做我所有的SQL,如果你可以讓它爲你組織你的數據。

可能的答案2:排序的陣列

也許你可以在數組進行排序(再次,最好讓你的數據庫做到這一點)。可能你 可以排序B,以便搜索匹配更快。或者將搜索值放在 數組的密鑰中,以便搜索非常快。或者,如果幸運的話,您可以按照使所有A和B的順序相同的方式排列兩個 數組。即對於任何你選擇你的人而言, 知道正確的B或者不存在或者稍後存在於B陣列中。

可能的答案3:解釋一下這個問題

你只給了我們當前的算法,而不是你實際上是試圖做。大多數 可能遍歷所有內容不是最好的想法,但沒有人能說,除非他們知道更多關於您的數據以及您最終想做什麼的 。

1

這取決於您的數據,當然....

一些基本方面:

  • 這真的聽起來像一個用例的數據庫查詢,而不是PHP腳本。尋找數據集中的比賽是什麼數據庫是擅長的,沒有章法將使PHP腳本在同一聯賽
  • 連打,如果你真的要使用PHP腳本功能嘗試

    • 不打你允許的內存限制。你的PHP服務器將會退出並返回一個錯誤,但是如果你的sql站點結果集變得太大,你的sql服務器可能會開始向hd寫入臨時數據,這會減慢整個執行時間 - >如果可能的話,獲取並處理數據塊(偏移量,限制)
    • 如果您匹配整個單詞,以這種方式構建匹配的數組,那麼搜索條件是一個鍵,而不是一個值,以便您可以使用isset($potentialMatches[$searchTerm]),這是更快的方式大於in_array($searchTerm, $potentialMatches)的較大陣列。樣機:

      while($ row = $ resultSet-> fetch_assoc()){ $ potentialMatches [$ row ['search_column']] = $ row; }


但它不能被反覆強調的是:通常的過程來處理這將是:

  1. 做匹配的DB-側
  2. 過程在您的腳本中匹配
  3. 如有必要:對不匹配的新查詢
  4. if 3.,在腳本中處理這些結果