- - PR -
大量ファイルの高速ダウンロード
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2005-10-25 22:32
FTPの学習をしているものです。
ファイルサイズの小さい(1Kバイト)のファイルを大量にFTPをつかってダウンロードできるものを作ってみたいのですが、内容としては、「RETRで1ファイルをダウンロード」をファイル数分繰り返しています。 このとき(データのソケットの生成等は省略しますと・・) 1、RETRを送る 2、150がレスポンスとして返ってくる(ダウンロード開始) 3、ファイル書き込み 4、226がレスポンスとして返ってくる(ダウンロード終了) 5、再び1に戻る(ファイル数分繰り返す) となっているようですが、1kバイト程度では実際のファイル書き込み時間が数十ミリ秒程度で終了するにも関わらず、その後の226が返ってくるまでには数百ミリ秒かかってしまうため、ファイル数が多いほど大幅なタイムロスとなってしまうようです。 このFTPサーバー側からは150を送った後に226を送る数百ミリはサーバー側の送信速度の限界なのでしょうか? 解決策がありましたら教えていただければ幸いです。 |
|
投稿日時: 2005-10-26 08:32
シリーズに処理するのではなく
並列で複数コネクションを開いて ダウンロードするのではどうでしょう。 あんまり、おすすめしませんが... .NETも関係ないような... |
|
投稿日時: 2005-10-26 10:07
送信完了(データ用のソケットを閉じる)時に、何度か応答待ちが必要になります。ネットワークでの応答待ちの遅延は数十msありますから、積み重なれば100ms程度の待ちが発生するのは当然でしょうね。Socketの接続/切断を繰り返すのは以外に負荷が高く、時間もかかります。FTPの仕様上の欠点ですね。
複数の接続を同時に処理するか、事前に細かなファイルをアーカイブしておくとか、FTP以外(HTTP1.1とか)を使うのが良いかと。 |
|
投稿日時: 2005-10-26 18:22
.netでやるとして。
圧縮の自動化も、下記の方法を応用すればできそうな気がします。 @IT .NET TIPS:動的に圧縮ファイルを生成するには? 手段を目的として質問されているのであれば、この回答は的外れですが |
|
投稿日時: 2005-10-27 00:23
参考になります。複数コネクションを作成する方法は考えていたのですが、やはり処理が複雑になるというデメリットがあるため他の手段でいきたい所です。
その他の意見を見させていただきました所、ファイルを圧縮、もしくはサーバー側で1つにまとめてダウンロードするという考えがよさそうと思いました。しかし、問題がありまして・・・・・ 「ダウンロードする大量のファイルが入っているディレクトリがどれであるのかクライアント側で指定したい」 という場合、あらかじめサーバー側で圧縮しておくのが不可能になってしまいます。 1、クライアントでログインする 2、クライアント側からサーバーの指定したディレクトリ(大量ファイル)を1ファイルにまとめる(圧縮する) 3、FTPでダウンロードする といった操作をおこないたいのですが・・・Aに相当するものが調べても例がないようです。 UNIXではログイン後に「tar cf」というコマンドを送信してサーバーのディレクトリ内のファイルをまとめるといったコマンドがあるようですが.NETではどうなのでしょうか? それとも考え方自体が間違っているのでしょうか? |
|
投稿日時: 2005-10-27 08:25
サーバーの環境にもよりますが、(Unix系でTelnetなどで接続できるとして)
C#(.NET)でTelnetクライアントプログラムを作成すれば tarコマンドを送信してファイルを圧縮することはできるかと思います。 |
|
投稿日時: 2005-10-27 21:53
クライアントからTelnetで接続できましたが・・・・・・・
サーバーのOSがWindowsのせいかコマンドがエラーとなるようです。 その後、コマンドプロンプトで接続後にHelpをしたところやはりコマンドが全く違っていました。 UNIXの事はよくわからないのですがサーバークライアント両方がWindowsの場合はtarコマンドはつかえないのでしょうか?つかえないようでしたら圧縮解答のコマンドを教えていただきたいです・・・・・・ [ メッセージ編集済み 編集者: 未記入 編集日時 2005-10-27 21:54 ] |
|
投稿日時: 2005-10-27 23:40
Windowsでは基本的にはtarは使われないので、
Windowsの標準機能で圧縮したい場合は cabがほぼ唯一の選択肢になるかと思います。 makecab/expand のコマンドリファレンスをご参照ください。 #ただし上記のコマンドはサーバがWin2000以降であることが前提です。 ただTelnetでログインして、一時的に圧縮ファイルを作ったりすると、 一時保存場所や、ファイルの後始末など厄介な問題が多いと思いますが。 基本的にこの類の処理はサーバ主導でやるべきだと思います。 個人的には。 #単に実験のためなのか、システムを作ろうとしているのかで話は変わりますが。 [ メッセージ編集済み 編集者: sia 編集日時 2005-10-27 23:41 ] |
1