現在有一批通訊錄資料(10000多個人的通訊錄)需要找出每兩個人的通訊錄的重複部分(就是誰和誰的通訊錄重複了多少條)要所有人的通訊錄都兩兩比對一遍
例如 有 ABCDE四個人的通訊錄 找出 AB AC AD AE BC BD BE CD CE DE 之間的通訊錄重複條數
手機號重複 就認為這兩條通訊錄重複
這個是資料表,有10000多個人通訊錄
list欄位存的json就是通訊錄的內容
一個人通訊錄 100條到1000條不等
我目前嘗試的做法是,一下取出所有人的通訊錄,然後拿第一個人跟剩下所有人的進行比對(foreach這個數組,裡面嵌套foreach) 然後拿第二個人的跟剩下所有人的比對,以此類推.
指令碼部分代碼
然後運行指令碼 指令碼跑了20多個小時 才跑了一半左右 記憶體,CPU佔用也比較高 指令碼效率太低了
請教一下,有沒有更好方法來找出這批資料的重複部分,或者指令碼怎麼最佳化最佳化
謝謝大家
回複內容:
現在有一批通訊錄資料(10000多個人的通訊錄)需要找出每兩個人的通訊錄的重複部分(就是誰和誰的通訊錄重複了多少條)要所有人的通訊錄都兩兩比對一遍
例如 有 ABCDE四個人的通訊錄 找出 AB AC AD AE BC BD BE CD CE DE 之間的通訊錄重複條數
手機號重複 就認為這兩條通訊錄重複
這個是資料表,有10000多個人通訊錄
list欄位存的json就是通訊錄的內容
一個人通訊錄 100條到1000條不等
我目前嘗試的做法是,一下取出所有人的通訊錄,然後拿第一個人跟剩下所有人的進行比對(foreach這個數組,裡面嵌套foreach) 然後拿第二個人的跟剩下所有人的比對,以此類推.
指令碼部分代碼
然後運行指令碼 指令碼跑了20多個小時 才跑了一半左右 記憶體,CPU佔用也比較高 指令碼效率太低了
請教一下,有沒有更好方法來找出這批資料的重複部分,或者指令碼怎麼最佳化最佳化
謝謝大家
$data = array( array('id'=>1,'name'=>1), array('id'=>2,'name'=>2), array('id'=>3,'name'=>3), array('id'=>1,'name'=>2));$ret = array();# 資料遍曆一次,以計算重複key作為key建立資料,如果存在value +1,如果不存在設定為1foreach($data as $k=>$v){ $_id = $v['id']; $_name = $v['name']; if (array_key_exists($_id, $ret)) { $ret[$_id]++; }else{ $ret[$_id] = 1; }}# 遍曆結果foreach($ret as $k=>$v){ echo "{$k}出現{$v}次\n";}#print_r($id)