1台のPCから 3台のPCに 2000個程のデータをそれぞれにコピーを行っています。
それぞれ別々のデータ(計6000個)で ファイルサイズは大小さまざまで数100Mから数K
まであります。今までは 単にCopyFileを使い、ひとつずつコピーを行っておりました
がコピーに5分程度かかってしまいます。
それで 並列に処理させたらいいと思い、3台のPC用にそれぞれスレッド作成し、
CopyFileでコピーしましたが 早いときは3分程度で 終わるのですが 遅い場合は 10
分程度かかり、速さが安定しません。
このような 複数のPCに 大量のデータを コピーする場合は
どのようにすれば早くなりますか?
環境は
XP64bit
VS2008 です。
処理を並列にしても、ハード(HDDなど)は並列に動くようにできてないものなら
無駄なランダムアクセスが発生し時間が不安定になるのは仕方ない。
2000個ずつのデータを事前に連結ファイルにして1個(計3個)にしておくか
ハード面を高速のモノに取り換えるぐらいしかないでしょう
回答 ありがとうございます。
知識がなくてすみません。
連結ファイルにするというのは どうゆうことでしょうか?
圧縮して1つにするという意味でしょうか?
(容量的にも すべてで 15G以上はあります。)
ハード面を高速なものにするというのは
SSDを使うみたいなことでしょうか?
ご教授願います。
この手の「性能」の話は、どこがネックになっているかの測定から。
・サーバ側の記憶装置(ハードディスク)が遅い?
・サーバクライアント間のネットワークが遅い?
・クライアント側の記憶装置(ハードディスク)が遅い?
・上記以外の何か(たとえばウイルス対策ソフトのリアルタイムスキャン)が遅い?
すでに速いところをさらに速くしても効果はない。
遅いのがハードディスクであると確定したのならば SSD にするのは意味があるが
そうではないのなら無駄な投資。
え~と、回答ではありません。単なる感想です。すみません。
こういった「サーバーがお配りする」仕組みって、やや不利なんですよね。
「クライアントが持ってくぞ」型にするとやや改善すると思うんですけど、
いまさら仕組みを変えるわけにはいかないでしょうね(vv;)。
1.同じ物を3ヵ所にコピーするなら1度だけメモリに読み込んで
メモリ内容をコピーした方が早いのでは?
2.結構管理が面倒くさいですがある程度のメモリを確保して
複数ファイルを一気に読み込んで各PCに書き込む
#2番目はもうフリーソフトでありますね
#FireFileCioyとか。検索すると仕組みも書いてあります。
組み合わせれば早くなるのでは?
大事なこと核の忘れてた
1度読み込んだファイルをメモリにためて各スレッドで
共有して書き込めば1/3とはいかないまでも少しは早くなるんじゃないかと。
うーーん、
1. ソフトを考える前に、実際にコピーをするファイルを作ってエクスプローラを使って
コピーしてみる。
2.時間を測定してみる。
僕が考えるに、どんなに速くコピーするソフトを作ってもエクスプローラを使って
コピーするのと比べるとあまり速くなっていないと思います。
速くコピーすることを考えるよりも、スレッドを使い、2000個のファイルをいかに
効率よくまとめてコピーするかを考えた方がいいと思います。
>それで 並列に処理させたらいいと思い、3台のPC用にそれぞれスレッド作成し、
>CopyFileでコピーしましたが 早いときは3分程度で 終わるのですが 遅い場合は
>10分程度かかり、速さが安定しません。
タイマーやイベント等の同期オブジェクトをうまく使って速さを安定させることを
考えたほうがいいと思います。
ちなみに3台のPCはHUBを介して1つのポートでつながっていますか?
それとも1ポートずつ直結させていますか?
もしHUB経由の1ポートだったらポート増設して1台ずつ直結させたら
回線が分かれるので多少は早くなるはず(仕様/環境が許せばですが)
皆様 回答ありがとうございます。
あうあう様 :
各PCにコピーするファイルは別々なので 提案していただいたやり方では やりにくい
とは思いますが そのような方向を当方も考えておりました。
実際 自分が試したやり方では スレッド化して 読み込み書き込みがぶつからないよ
うにしたとき(CopyFileを使っているため書き込み読み込みは分離していなく その部
分だけをmutexで止めた) LANの稼働率(タスクマネージャーのネットワークで出るや
つ)が 上がり下がりありますが 最大60%ぐらいで安定しており、書き込みをぶつか
るぶつからないを考慮せず、ただのスレットだけで 行った場合は ほぼ100%になるの
ですが 安定感がなく、次に同じ動作をさせると、数十秒100近くになったあと 2,30%
に落ちてしまいます。
Fire File Copyなどの別ソフトというのは これまでに使ったことがなく、やり方考え
てみます。
ITO様 :
エクスプローラで ソフトと同じように ファイルのコピーを3つ同時に行うと
はじめの 数十秒間は 早いのですが 途中から 遅くなり 10分以上かかりました。
LANの稼働状況で行くと 上記のスレッドの 書き込み読み込みが ぶつかるのを考
慮しないパターンと同じ感じです。
この場合 HDDのアクセスが 怪しいのでしょうか?
みい様 :
1つのポートでHUBにつながっています。
すみません。現段階でハード的には変えにくいです。
>この場合 HDDのアクセスが 怪しいのでしょうか?
うーーん、
ファイルが2000個もあり、15GBもあるのだからと思います。
ウインドウズはマルチタスクOSですが、マウス・キーボート・システム関連の処理を約200mS
間隔でチェックします。これは通常最優先で処理されます。
> 早いときは3分程度で 終わるのですが 遅い場合は 10分程度かかり、速さが安定
しません。
容量の小さいファイルをまとめて先にコピーして後から大容量のファイルをまとめて
コピーするとかすると3分程度で一定になるってことはないでしょうか?
あくまで推測です。
エクスプローラは安全策で10分以上かかるようにしているのだと思います。
容量は1.5G程度です。
間違えておりました。
すみません。
>容量は1.5G程度です。
ファイル数は変わらないとなるとあとは2000あるファイルをうまく選択して、
効率よくコピーすることが大切だと思います。
> 早いときは3分程度で 終わるのですが 遅い場合は 10分程度かかり、速さが安定
しません。
3分が限度と考えて、
スレッドを活用して3分ぐらいで処理時間が維持できるようにする
のがいいと思います。
>容量は1.5G程度です。
8.33[MByte/s]は、昨今ではかなり遅いネットワークと言えるかもしれません。
このあたりにヒントがあるような気がします。