2013-08-16 5 views
-1

하드 스크립트를 최적화해야합니다. 현재 런타임 ~ 5 시간.하드를 최적화하는 방법은 무엇입니까?

테이블 파일에서 스크립트 찾기 중복은 md5 해시로 테이블 폴더를 사용합니다.

DB : MySQL, 서버 : 로컬.
컴퓨터 : 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, 폴더 _. (~ 45 레코드)
테이블 파일 : file_id, file_hash, file_folder_id, file_name. (~ 1,400,000 개 레코드)

+2

어느 부분이 항상 걸립니까? 프로파일 링을 시도하거나 적어도 여러 지점에서 시간을 반향하여 최적화 할 부분을 확인하십시오. – Anigel

+0

@Anigel'if ($ value-> file_hash == $ v-> file_hash && $ value-> file_id! = $ v- > file_id)'= 99 % 시간. – iproger

+4

모든 파일 해시가 데이터베이스에 저장되어있는 것처럼 보입니다. 단지 SQL 쿼리에서 복제 해시를 직접 선택하지 않는 이유는 각각 140 만 개의 루프 대신에 (해시)> 1 인 파일 그룹에서 선택하십시오. 어느 루프 1.4 백만 가지 – Anigel

답변

0

foreach {foreach {}}를 사용하지 마십시오. foreach {in_array()}를 사용하십시오.

-50 % 시간.

1

먼저 매우 유용한 일 수 있습니다. 실제로 달성하려고 시도한 내용입니다.

나는 소스 코드에서 읽을 수있는에서

:

  • 당신은 파일과 해시에 대한 링크를 포함하는 데이터 테이블이있다.
  • 파일을 설치, 변경 또는 제거했는지 (주기적으로) 확인하고 싶습니까?

첫 번째 질문 : 제기 : 은 (는) 파일이 삽입, 제거 또는 편집 되었습니까? 사용자는 폴더에 직접 액세스 할 수 있습니까? 아니면 모든 종류의 응용 프로그램을 통해 발생합니까?

응용 프로그램을 통해 발생하는 경우 THAT 지점을 업데이트하고 데이터베이스에서 오래된 항목을 플래그해야합니다. (즉,

  • 저장 타임 스탬프 : 그 경우 UPDATE files SET 'requires_approval'=1 WHERE filename LIKE '{$current_changed_file}'

    같은 뭔가 경우 (사용자가 파일 시스템 레벨에서 파일을 삽입, 삭제, 편집) 다음을 수행하여 검사를 최적화 할 수있다 아닙니다 ANY 파일의 최신 수정 날짜)를 데이터베이스에 저장하십시오.

  • 변경 사항을 확인할 때 수정 날짜가 늦은 파일 만 고려하십시오.

뭔가

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

같은 (삭제를 인식하는, 모든 파일 져야 할 엔트리 (데이터베이스)를 반복 할 수 및 is_file을 사용 - 당신이 파일 해시 걱정하지 않아도 삭제를 들어, 심지어 생성 할 수 없기 때문에)

+0

답변 해 주셔서 감사합니다 (Who set me -1?). 파일이있는 폴더입니다. http://s018.radikal.ru/i504/1308/09/d1a90da9da88.png – iproger

+0

알고리즘 : 1. 파일을 얻습니다 (~ 30,000 주). 2. 매주마다 폴더 (2013 -... ..)를 만들었습니다. 3. 내 프로그램 (xml-list 생성 및 PHP를 사용하여 mysql에 삽입)으로 파일을 검색합니다. 3.5. 중복 된 파일을 비교하는 파일. 4. 이전 폴더 (2012 -... ..)에서 다른 사람들을위한 파일을 제공 할 수 있습니다. 댓글 3.5 : 이전 폴더에서 폴드를 삭제할 수 없습니다 (이유를 이해해 주시기 바랍니다). – iproger

+0

아직받지 못하고 있습니다. @dognose에 따르면 중복 여부를 확인하는 시간은 새로운 중복 파일이 추가 될 때입니다. 추가 시점에 비용이 많이 들지만 CheckForDuplicates 테이블에 추가하고 예약 된 백그라운드 작업에서이를 처리 할 수도 있습니다. –

관련 문제