Re: [請益] 運算陣列太大,會跑不太出來嗎?

看板PHP作者 (身為老爸老媽嚕..)時間14年前 (2010/04/20 19:25), 編輯推噓0(002)
留言2則, 2人參與, 最新討論串2/5 (看更多)
如果 select 出來的 rows 數量預期比 150萬 小很多的話 那麼直接在 render 出圖形的 loop 裡(這個loop預計是0~150萬) 直接去 rows count 出數量來 loop 數會是 150萬*(n of rows) (原本的loop數150萬*n for count value + 150萬 for render) 而且不用maintain一個150萬大小的array (記憶體jump是很慢的) for($i = 0; $i<150萬; $i++) { $value = 0; foreach($rows as $row) { if( $i >= $row['start'] && $i <= $row['end']) $value++; } // render for $i and $value } 這樣雖然 loop 數沒有減少太多 但是 storage cost 減少 cputime cost增加 應該還是有稍微快一點 ※ 引述《eco100 (Maktub)》之銘言: : 我的問題是這樣的 : 我有一組raw data 這組raw data各有一個start及end值 : 這兩個值的大小範圍 最小從0開始 最大可能會到 1500000 : 我想要用這些raw data 的start值到end值 的「出現次數」做累加 : (除了start及end兩端點外,中間的值也會累加) : 然後在數線上畫出累加的高度值 畫出來 會像一座座的山峰一樣 : 我的想法是我先宣告一個0到1500000的"0"陣列(raw data 中end可能出現的最大值) : 然後讀到第一列資料時 : 會有另外一個陣列 將start到end之間的區段 給予 1 的數字 其他為 0 : 然後把這個陣列加到 一開始宣告的 0 陣列中 : 讀到第二列時 又得到某個區段為1的陣列 再加到 一開始的 0 陣列中 : 直到所有raw data 加完為止 : 然後再把最後加完的陣列的每一個元素 當做高度畫在數線上 : 以下是我的程式 : $result = mysql_query(" : select * : from raw_data : "); : $arr = array_fill(0,1500000,'0'); //先宣告一個0陣列 : while($row = mysql_fetch_array($result,MYSQL_BOTH)){ : $start = $row["start"]; : $end = $row["end"]; : $base = array_fill($start,$end-$start+1,'1'); //start到end為1 : $front = array_pad($base,-($end+1),0); //前面為0 : $back = array_pad($front,$size+1,0); //後面為0 : foreach($arr as $key => $value){ : $arr[$key] = $arr[$key] + $back[$key]; //把每一陣列元素相加 : } : } : for($i=0;$i<=$size;$i++){ //畫圖 : if($arr[$i]!=0){ : imageline($im,$start_x+$mod*$ratio,$quo*100-$arr[$i]+100,$start_x+$mod*$ratio,$quo*100+100,$green); : } : } : 想請問 這樣的寫法 會不會因為陣列太大造成程式要跑很久? : 因為我自己測了一下 程式應該沒錯 但是執行時 都跑不太出來 > < : 是否還有其他 更有效率的寫法? : 有請高人指點一下 謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.251.208.29

04/20 19:27, , 1F
那段 foreach 改用 array_walk 說不定會再快一點
04/20 19:27, 1F

04/20 23:31, , 2F
把$i變成字串,這樣陣列可以改成hashtable,才會快吧。
04/20 23:31, 2F
文章代碼(AID): #1BpOyfMD (PHP)
討論串 (同標題文章)
文章代碼(AID): #1BpOyfMD (PHP)