web-dev-qa-db-ja.com

接続不良で大きなファイルをダウンロードする

悪い接続を介して大きなファイルをダウンロードするために使用できる既存のツールはありますか?

300 MBの比較的小さいファイルを定期的にダウンロードする必要がありますが、低速(80〜120 Kバイト/秒)TCP接続は10〜120秒後にランダムに切断されます(大企業のネットワークです。私たちは彼らの管理者(インドで働いています)に何度も連絡しましたが、彼らは何もできないか、したくありません。問題は、リバースプロキシ/ロードバランサーにある可能性があります。

これまでは、pcurlの変更バージョンを使用していました: https://github.com/brunoborges/pcurl

私はこの行を変更しました:

curl -s --range ${START_SEG}-${END_SEG} -o ${FILENAME}.part${i} ${URL} &

これに:

curl -s --retry 9999 --retry-delay 3 --speed-limit 2048 --speed-time 10 \
    --retry-max-time 0 -C - --range ${START_SEG}-${END_SEG} -o ${FILENAME}.part${i} ${URL} &

--speed-limit 2048 --speed-time 10を追加する必要があったのは、接続が失敗した場合、接続がハングするのは主に数分だからです。

しかし、最近ではこのスクリプトも完了できません。

1つの問題は、-C -の部分を無視するように見えるため、再試行後にセグメントが「継続」されないことです。関連する一時ファイルが切り捨てられ、失敗するたびに最初から開始されるようです。 (--range-Cオプションは一緒に使用できないと思います。)

他の問題は、このスクリプトがすべてのセグメントを同時にダウンロードすることです。 300のセグメントを持つことはできません。一度にダウンロードされるのは10セグメントのみです。

この特定の目的でダウンロードツールをC#で作成することを考えていましたが、既存のツールがある場合、またはcurlコマンドがさまざまなパラメーターで適切に機能する場合は、少し時間を割くことができます。

更新1:追加情報:並列ダウンロード機能には接続ごとの帯域幅制限(80〜120 Kバイト/秒、ほとんどは80)があるため、削除しないでください。10接続で10倍の速度向上が可能です。ファイルは1時間ごとに生成されるため、ファイルのダウンロードは1時間で完了する必要があります。

31

lftpWikipedia )はそのために適しています。多数のプロトコルをサポートし、複数の同時並列接続を使用してファイルをダウンロードでき(輻輳が原因ではない多くのパケット損失がある場合に役立ちます)、ダウンロードを自動的に再開できます。スクリプトも可能です。

ここにあなたが思いついた微調整(あなたへのクレジット)を含みます:

lftp -c 'set net:idle 10
         set net:max-retries 0
         set net:reconnect-interval-base 3
         set net:reconnect-interval-max 3
         pget -n 10 -c "https://Host/file.tar.gz"'
35

あなたの状況ではこれをテストすることはできませんが、--range-C -と一緒に使用しないでください。これは、この件名についてのmanページの内容です。

-C -を使用してcurlに転送を再開する場所/方法を自動的に見つけるように指示します。次に、指定された出力/入力ファイルを使用してそれを把握します。

代わりにこれを試してください:

curl -s --retry 9999 --retry-delay 3 --speed-limit 2048 --speed-time 10 \
    --retry-max-time 0 -C - -o "${FILENAME}.part${i}" "${URL}" &

シェルが変数を解析しようとしないように、常に変数を二重引用符で囲むことを強くお勧めします。 (URL https://example.net/param1=one&param2=twoを検討してください。シェルは&で値を分割します。)

ちなみに、120 KB/sは約1.2 Mb/sで、世界の多くの地域で一般的なxDSLアップロード速度です。 MBあたり10秒なので、ファイル全体で1時間弱。それほど遅くはありませんが、速度よりも信頼性に関心があることを感謝します。

12
roaima

多分あなたはwget --continue

wget --continue ${URL}

参照 https://www.cyberciti.biz/tips/wget-resume-broken-download.html

8
Alex338207

箱の外:眼帯を装着してbittorrentを使用します。トレントを作成するときは、ブロックサイズを小さくしてください。明らかに、ファイルを暗号化して、トレントを見つけた他の誰も何も役に立たないようにします。

4
Loren Pechtel

以前の仕事でも同じ問題がありました(ただし、(オフィスからの)不安定な接続での300GB以上のオフサイトデータベースバックアップを除く)。ユーザーは約より大きいファイルをダウンロードする重大な問題を抱えていました。接続が始まる前に1 GB。彼らはRDP接続を介して標準のWindowsコピー/貼り付けファイルを使用したので、不思議ではありません。

私が見つけた1つのことは、VPN設定がネットワーク設定(主にMTU長)と完全に一致していないことです。 2つ目は、Windowsのファイルコピー機能は、インターネット経由でデータをコピーするために作成されていないことです。

私の最初の解決策は単純なFTPサーバーでしたが、送信時間(多くの場合、接続で3〜4時間)の問題は解決しませんでした。

2番目の解決策は、 Syncthing を使用して、ファイルを社内のNASに直接送信することでした。バックアップが完了した後の毎晩、Syncthingは必要なすべてをNASをオフィスに送り返しました。3時間以上の送信時間の問題が解決されただけでなく、1-2危機が発生した場合、データを提供するために何時間もかかります。毎朝午前8時に、ファイルはNASで更新され、バックアップの準備が整いました。巨大なファイル(ある時点では、ほぼ700GBのデータベース)でも、まだファイルの破損やその他の問題が発生する...

Syncthingはセットアップと管理が非常に簡単で、すべてのプラットフォーム(電話を含む)で使用でき、接続不良の処理に優れています。接続が失敗した場合、Syncthingは数分待ってから再試行します。

同期するにはローカルフォルダーが必要ですが、ファイルは更新されるとすぐに利用できるようになります。

Syncthingのもう1つの良い点は、ファイル内で変更のみを同期するに設定できることです(差分バックアップのように)...おそらく帯域幅の問題の一部を解決します。

3
Tylon Foxx

お粗末な接続でファイルを移動するための旧式のソリューション-- zmodem を検討するかもしれません。

これは、人々が電話を手に取り、接続を爆撃する2400ボーモデムが標準であったときに開発されました。試してみる価値があるかもしれません。

1
BoredBsee

Kermit を使用してみてください:

カーミットプロトコルを他のほとんどのプロトコルと区別する機能は、パケット長、パケットエンコーディング、ウィンドウサイズ、文字セット、エラー検出方法、タイムアウトなど、2種類のコンピューター間の接続の種類と品質に適応できる幅広い設定です。 、一時停止します。他のほとんどのプロトコルは、特定の種類または品質の接続でのみ、および/または特定の種類のコンピューター間または同様のファイルシステム間でのみ機能するように設計されているため、他の場所ではうまく機能しない(またはまったく機能しない) -状況に応じて。一方、Kermitを使用すると、任意の接続でファイル転送を成功させ、最高のパフォーマンスを実現できます。」

0
Wallace Howery