2012-02-27 6 views
1

私は、ファイルをコンピュータ間で同期させる必要があるプロジェクトを持っています。ファイルを同期する

私の問題は、私のプログラムでは、実行時間が30秒から切れるというエラーが出るということです。

今、私はこれでPHPでプログラムを作っています。 これは、古いファイルをブロックに分割し、各ブロックのmd5ハッシュを作成し、任意のオフセットで指定された長さのハッシュを動的に作成することにより、ファイルを と比較します(開始から修正ファイルの最後まで)。転送する必要のないブロック

そこにいずれはすべての経験、アドバイス、リンクや私は、PHP、JavaやC++で動作するように贅沢を持っているあなた以上welcome.Thnx

p.sをコーディングしています。

私が与えているコードは、テスト用です。同じ場所から2つのファイル(1つの変更されたファイルと元のファイル)が古いファイルのブロックをハッシュし、それを1つおきに新しいファイルのハッシュと比較しますオフセット。これが役に立てば幸い:

<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

はね... – aioobe

+0

はあなたがで問題が発生したコードを投稿してくださいだろうか?あなたがしたい言語は何でもできます。 – mindandmedia

+0

rsyncを使用するという贅沢はありますか? –

答えて

0

あなたはいつも汚いトリック適用することができます。

<?php set_time_limit(9999); ?> 

をしかし、私は@aioobeに同意するには、衣替えrsyncのように聞こえます。

+0

もちろん、これはrsyncのコンセプトを使ったrsyncと似ていると皆さんもまったく同意します。 しかし、私の問題は です。変更されたファイルのブロックを比較することは非常に効率が悪く、タイムアウトの問題があります。 実行速度を向上させ、実際に動作させるための提案や手掛かり..... thnx –

+0

0を使用して制限を無効にしないのはなぜですか? – rekire

1

タイムアウトを増やすことは、最初のコールポートです。

もっと最近の修正日があり、ファイルの長さが違う場合は、md5の比較のみを行っているとします。

C++を使用している場合は、ファイルが変更されたときにファイルシステムウォッチャーを使用して通知し、それを使用してプロセスをトリガーするか、ハッシュの作成をトリガーすることができます。

もう一つのトリックは、バイナリ差分を作るためのキャッシュファイルに次のようになります。あなたが `rsync`を再発明しているよう

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

関連する問題