我必須優化硬腳本。當前運行時間〜5小時。如何優化?
腳本通過md5哈希查找表文件中的重複項使用表文件夾。
DB:MySQL,server:local。
計算機:AsRock Z77 pro4,英特爾酷睿i7 3770,12GB內存。
代碼:
// find file-duplicates by md5-hash
$current_folder_id = 1;
$select_ids_files = array();
$folders = $this->db->query("
SELECT `folder_id`
FROM `sc_folders`
")->result();
if (!$folders)
exit('folders not found');
$current_files_data = $this->get_files_by_folder_id($current_folder_id);
if (!$current_files_data) {
exit('!current_files_data');
}
foreach ($folders as $folder) {
$files = (object)array();
$files = $this->get_files_by_folder_id($folder->folder_id);
if (!$files)
continue;
if (count($files) > count($current_files_data)) {
$gl_arr = &$files;
$nogl_arr = &$current_files_data;
} else {
$gl_arr = &$current_files_data;
$nogl_arr = &$files;
}
foreach ($gl_arr as $key => $value) {
foreach ($nogl_arr as $k => &$v) {
if ($value->file_hash == $v->file_hash && $value->file_id != $v->file_id) { // an important place for optimize
$select_ids_files[] = $v->file_id;
}
}
}
}
print_r($select_ids_files);exit; // id duplicates records
表文件夾:folder_id,FOLDER_NAME。 (約45條記錄)
表文件:file_id,file_hash,file_folder_id,file_name。 (約1,400,000條記錄)
哪一部分需要所有時間?嘗試對其進行分析或至少回顯各個時間點的時間,以查看需要優化的部分 – Anigel
@Anigel'if($ value-> file_hash == $ v-> file_hash && $ value-> file_id!= $ v- > file_id)'= 99%的時間。 – iproger
它看起來像所有的文件哈希存儲在數據庫中爲什麼不直接選擇重複哈希直接在SQL查詢類似'select * from files group by hash having count(hash)> 1',而不是每個140萬個循環其中循環1。400萬東西 – Anigel