- PR -

Javaによるサーバ間ファイル同期について

投稿者投稿内容
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2007-10-18 08:33
引用:

Bobさんの書き込み (2007-10-17 14:12) より:
2の処理ではファイルが多くなると当然処理時間が長くなります。
2の処理でもっと効率的なアルゴリズムはないでしょうか?


(以下、アルゴリズム的なことだけにふれ、ファイル同期自体についてはふれないこととします。)

アルゴリズム的には、マージソートと同様のことをするのが、コストが少なくて良いと思います。
http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%BC%E3%82%B8%E3%82%BD%E3%83%BC%E3%83%88

すなわち、サーバAとサーバBのそれぞれのファイル名を一旦ソートしておいて、両者をマージするようなこと(マージする手前まで)をやろうとすれば、おのずと差分を抽出できます。

ただ、CPUのクロックがGHz単位で、メモリーがGB単位で、スクラッチプログラミングがほとんどの現在、あまり細かいことに拘らなくても単純にファイルひとつごとリニアサーチしても「遅い」と言われることはまずないでしょう。
いや、でも本当は拘るべきですけど。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
yamasa
ベテラン
会議室デビュー日: 2003/02/15
投稿数: 80
投稿日時: 2007-10-18 12:50
引用:

unibonさんの書き込み (2007-10-18 08:33) より:

アルゴリズム的には、マージソートと同様のことをするのが、コストが少なくて良いと思います。
http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%BC%E3%82%B8%E3%82%BD%E3%83%BC%E3%83%88

すなわち、サーバAとサーバBのそれぞれのファイル名を一旦ソートしておいて、両者をマージするようなこと(マージする手前まで)をやろうとすれば、おのずと差分を抽出できます。



うーん、そこまで拘るのはやりすぎかと。
お手軽にやるなら、それぞれのファイル名をHashSetに入れてremoveAll()を呼べば一発ですよね。
a-san
ベテラン
会議室デビュー日: 2004/06/01
投稿数: 53
投稿日時: 2007-10-18 23:22
引用:
1.サーバAでサーバBをネットワークドライブに割り当てる。
2.JavaによりサーバAのディレクトリ内にあるファイルのファ
  イル名をサーバBのディレクトリのファイル名と1個1個比較
  して一致しないものを一覧として保持。
3.2.で保持したものをFTPで転送。


普通に考えれば1と3はネットワークの処理ですが、2はメモリ内の処理なので比べ物にならないぐらい高速です。2がボトルネックになるとは考えにくいです。
具体的に、ファイル数はどれぐらいなのでしょう?
また、実際に試してみて「2が遅い」ことが問題になっているのでしょうか?
Bob
会議室デビュー日: 2006/11/28
投稿数: 16
投稿日時: 2007-10-19 09:33
>具体的に、ファイル数はどれぐらいなのでしょう?
現在、一つのフォルダに2000程度で今後どんどん増えていきます。
しかも比較するフォルダは一つだけではなく、40個以上のフォルダ
を比較していかなければいけません。

>また、実際に試してみて「2が遅い」ことが問題になっているのでしょうか?
2の処理が異常に遅いことは実証済みです。
しかし、HashMapを利用したアルゴリズムを適用したところ
かなり改善されました。

たくさんのご返答どうも有難うございました。
皆様のご意見を参考にして検討させていただきます。

スキルアップ/キャリアアップ(JOB@IT)