看板 PHP 關於我們 聯絡資訊
不曉得颱風天的星期五,大家會不會比較有空回我問題...哈 話說最近小弟在寫演算法的程式,我採用IIS7+PHP5來寫, 一開始在跑小量的資料上是沒問題的,直到準備開始跑大量資料的時候 卻發現效能不彰的情況,後來我開始重新檢查我的程式碼,並且一步一步的 修正它,的確有明顯的改善執行時間(27X秒->197秒),但是還是在跑排列組合 大一點的資料的話,一樣會超過3600秒(為改善程式碼之前跑8個小時還沒跑完T_T) 後來我觀查一下變慢的原因,我發現主要時間花在對資料進行排列組合的步驟, 那我猜有兩種原因(以下限定程式只跑3回合) 1.排列組合項目很多。例如第2回合108個項目,到第3回合會組合到3753個,花費 33秒 2.IIS7對記憶體分配有特別的管理,因此在超過一定的量之後會變慢 (最後記憶體使用12.83MB)(我有設定ini_set( "memory_limit", "1024M" );) 3.陣列超過一定大小會變很慢(我猜暫存的陣列到後面應該超過32767列吧) 我個人改善的方法是減少迴圈數,能break掉的就break掉,至於 < 跟<= 的寫法 "感覺上",在整體演算法裡面算不痛不養的改善... 我也試著用APACHE來執行看看,結果發現效能是IIS7的2倍"差",跑出來我都囧了, 可能是我是windows環境,加上我也不知道APACHE怎麼把它給優化。 請問各位可以給我效能改善的意見嗎? 例如寫法上的問題、IIS7 or APACHE的設定,PHP參數設定之類的。 我現在當下想的到,但是還沒實作的 1.換成C語言來寫 2.試著不要全部用memory,把結果寫回disk,使記憶體、陣列使用變寫 但是第2項我怕問題根本不在那邊 >"< 最後,謝謝各位看完這篇文章。 -- 從一代一代的問候就看的出來 老手對新手的照顧 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.173.170.149
akasan :換C寫比較實際 寫回disk基本上只會變更慢... 08/07 12:21
lausai :用C吧.. 之前我也用PHP寫過運算複雜的程式 實在有慢 08/07 12:59
tkyifang :你的"運算",是否一定要即時運算,可否先算好儲存在 08/07 14:10
tkyifang :靜態網頁/資料庫,使用時動作盡量少 08/07 14:11
tkyifang :排列組合這種運算..感覺不應該是網頁的工作 08/07 14:13
cjoe :看來只好改成C了...Orz 08/07 14:19
huge :用apriori algo? 08/07 15:37
cjoe :經過我的實驗,應該跟記憶體無關,後來吃到160 MB 08/07 16:15
cjoe :速度一樣很快,看來可能是迴圈太多圈了,PHP暈了 08/07 16:16
cjoe :回huge,我在寫CBA,跟apriori很像,基本上概念一樣 08/07 16:17
bobju :處理這種問題之所以用php,可能是因為可以節省資料結 08/07 19:39
bobju :構設計上的複雜性(php的array非常好用).另外,用php來 08/07 19:39
bobju :跑當然沒問題,不過你應該用命令列模式來跑的才對,而 08/07 19:40
bobju :非透過http.至於跑出來的資料把它丟進資料庫.要查詢 08/07 19:41
bobju :及瀏覽才透過http呼叫負責處理的php程式.總之,就是分 08/07 19:42
bobju :開來寫&分開作業:資料分析運算的 跟 資料查詢瀏覽的. 08/07 19:43
reflynet :試試看透過cli跑,然後每個pass跑完都存進文字檔? 08/07 20:47
buganini :能用CLI跑的就用CLI 掛在HTTPD底下 有時候跟 08/08 00:31
buganini :HTTPD共用資源的下場會很糟 08/08 00:31
cjoe :經過測試...用CLI結果也是一樣慘 囧 08/09 23:31
huge :這麼多candidates,那有沒有重複的運算是可以省的? 08/09 23:46