2012-02-27 74 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