2012-02-27 75 views
1

我有一个文件必须跨计算机进行同步的项目。正在同步文件

我的问题是我的程序给出了一个运行时间超过30秒的错误。

现在,我已经在这个PHP的程序; 它做的是将旧文件分成块,并使每个块的MD5散列,并通过在任何偏移处动态地生成给定长度的哈希(从修改文件的开始到结束)来比较 它与修改后的文件。不需要转移的块。

任何一个在那里有什么经验,建议,链接或代码的超过welcome.Thnx

P.S我拥有的奢侈品在PHP,Java的工作或C++。

我给出的代码是用于测试目的,它需要来自同一位置的2个文件(一个修改的文件和另一个原始文件)使旧文件块的哈希值与新文件的哈希值进行比较抵消。希望这有助于:

<html> 
<body> 
<?php 
    $k=0; 
    $old_file = file_get_contents('11.jpg'); 
    $new_file = file_get_contents('12.jpg'); 
    $block_length = 2048; 
    $j = 0; 
    $md5_hashes_old = array(); 
    $md5_hashes_new = array(); 
    $diff_blocks = array(); 
    $first_char=array(); 
    $k = 0; 
    while(1){ 
    if($j >strlen($old_file)) 
    break; 
    $block = substr($old_file,$j,$block_length); 
    $md5_hashes_old[$k] = md5($block); 
    $first_char[$k]=$block[0]; 
    $j = $j+$block_length; 
    $k++; 
    } 
    $j = 0; 
    $k = 0; 
    $no_of_blocks = sizeof($md5_hashes_old); 
    echo $no_of_blocks; 
    $matched_blocks = array(); 
    $matched = 0; 
    $fc=0; 
    echo $md5_hashes_old[1].'</br>'; 
    for($i=0;$i<$no_of_blocks;$i++){ 
     $j =0; 
     while(1){ 
    $block = substr($new_file,$j,$block_length); 
    $md5_hash = md5($block); 
    if($md5_hashes_old[$i] == $md5_hash){ 
     $match_block = array(); 
     $match_block['block_no'] = $i; 
     $match_block['index'] = $j; 
     array_push($matched_blocks,$match_block); 
     break; 
    } 
    else 
     $j++; 

    if($j > strlen($new_file)) 
     break; 
    echo 'old='.$md5_hashes_old[$i].' i='.$i.' new='.$md5_hash.'</br>'; 
}  
}  
print_r($matched_blocks); 
?> 

</body> 
</html> 
+8

听起来你重塑'rsync' ... – aioobe 2012-02-27 12:18:22

+0

请你张贴你遇到问题的代码?你想要的任何语言都可以。 – mindandmedia 2012-02-27 12:20:07

+0

你有使用rsync的豪华吗? – 2012-02-27 12:45:22

回答

0

你总是可以应用使坏:

<?php set_time_limit(9999); ?> 

但我有@aioobe同意,听起来像一个改造rsync

+0

是的,我完全同意你们,这与rsync类似,我已经使用了rsync的概念。 但我在这里的问题是 比较块与修改文件中的每一个是非常低效的,因为我有超时问题。 任何建议或窍门,以提高执行速度,并实际上使其工作..... thnx – 2012-02-27 13:40:14

+0

你为什么不使用0来禁用限制? – rekire 2012-02-27 14:11:25

1

增加暂停时间是您的第一停靠位置。

我假设你只是在进行md5比较,当你有一个更新的修改日期和文件长度是不同的。

如果您使用的是C++,您可以使用文件系统监视器在文件被修改时得到通知,然后使用它来触发您的进程或触发哈希创建。

另一个技巧是缓存文件建立一个二进制DIFF:

http://dev.chromium.org/developers/design-documents/software-updates-courgette