-1

ハード スクリプトを最適化する必要があります。現在のランタイム ~5 時間。

テーブル ファイル内の重複を見つけるスクリプトは、md5 ハッシュによってテーブル フォルダーを使用します。

DB: MySQL、サーバー: ローカル。
コンピューター: AsRock Z77 pro4、インテル Core i7 3770、12Gb RAM。

コード:

// 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 レコード)

4

2 に答える 2

1

最初に、実際に何を達成しようとしているのかを述べると非常に役立つ場合があります。

ソースコードから読み取ることができるものから:

  • ファイルとそのハッシュへのリンクを含むデータテーブルがあります。
  • ファイルが挿入、変更、または削除されたかどうかを (定期的に) チェックしたいですか?

発生する最初の質問:ファイルはどのように挿入、削除、または編集されますか? ユーザーはフォルダに直接アクセスするだけですか、それとも何らかのアプリケーションを介してアクセスしますか?

アプリケーションを介して発生した場合は、そのポイントを更新し、データベース内の古いエントリにフラグを立てる必要があります。何かのようなものUPDATE files SET 'requires_approval'=1 WHERE filename LIKE '{$current_changed_file}'

そうでない場合 (ユーザーがファイル システム レベルでファイルを編集、削除、挿入している場合)、次のようにしてチェックを最適化できます。

  • タイムスタンプ (つまり、任意のファイルの最新の変更日) をデータベース内に保存します。
  • 変更を確認するときは、変更日が後のファイルのみを考慮してください。

何かのようなもの

foreach ($files as $file){
   if (filemtime($file) > $my_stored_modification_time){
      //refresh the data-row
   }
}

(削除を認識するために、すべてのファイルエントリ(データベース)を反復処理して使用できますis_file-削除の場合、ファイルハッシュを気にする必要はありません。ファイルハッシュを生成することさえできないためです)

于 2013-08-16T17:29:20.083 に答える
0

foreach {foreach {} } を使用しないでください。foreach { in_array() } を使用します。

-50% の時間。

于 2013-08-21T13:29:36.683 に答える