如何优化硬?

时间:2013-08-16 09:51:09

标签: php

我必须优化硬脚本。当前运行时间约为5小时。

脚本查找表文件中的重复项使用md5哈希表文件夹。

DB:MySQL,服务器:本地。
电脑:AsRock Z77 pro4,intel 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条记录)

2 个答案:

答案 0 :(得分:1)

首先,它可能非常有帮助陈述,你实际上试图实现的目标。

从我可以从源代码中读到的内容:

  • 您有一个数据表,其中包含指向文件及其哈希值的链接。
  • 您是否(定期)检查文件是否已被插入,更改或删除?

引发的第一个问题: HOW 是否插入,删除或编辑了文件?用户是否可以直接访问文件夹,还是通过任何类型的应用程序进行访问?

如果它通过应用程序发生,您应该更新该点,并标记数据库中任何过时的条目。像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 - 进行删除,您不需要关心文件哈希,因为您甚至无法生成它们) / p>

答案 1 :(得分:0)

不使用foreach {foreach {}}。使用foreach {in_array()}。

-50%的时间。