ローカルシステムでファイルを処理できるように、FTP経由で大きなファイルをダウンロードしています。ファイルを処理するプログラムは、1回のパスでファイルを1行ずつ読み取り、元のファイルから2つの新しいファイルを作成します。
完全にダウンロードされる前にファイルの処理を開始することは可能ですか?これに関する潜在的な問題は何ですか?
注:ダウンロードが完了する前にプログラムがファイルの最後に到達することについてはあまり心配していません。ファイルは、プログラムがデータを処理するよりも速くダウンロードされています。
プログラムが最初から順番にデータを読み取る場合は可能です。 (unzip
などの一部は、最初にファイルの終わりまでシークを試みます。)
ファイルが圧縮されていないと仮定すると、Linuxで次のことを試すことができます。
wget -O - www.fileserver.com/file.ext | tee outputfile.out | ./someprogram
-O -
によりwget
はファイルをstdout
に出力し、それはsomeprogram
にパイプされ、tee
はwget
outputfile
に出力します。
完全にダウンロードされる前にファイルの処理を開始することは可能ですか?
はい
これに関する潜在的な問題は何ですか?
EOF-それが本当にEOFであるかどうか、またはリーダーがレシーバーよりも高速で、読み取りを再試行する前に1秒待つ必要があるかどうかを判断する方法?
これに対する解決策は次のとおりです。
タイムアウトを使用する-ファイルサイズが数分間変化しなくなった場合、転送は完了したと見なされる場合があります。転送が正常に終了したのか、接続が失われたのかがわからないため、このソリューションは好きではありません。
事前にファイルサイズを取得してみてください。ftpサーバーを使用している場合は、通常、ダウンロードする前に「dir」コマンドを実行してファイルサイズを取得できます。この値はリーダープログラムに渡される場合があります
ダウンロードスクリプトを作成して、リーダープログラムがEOFに遭遇したときにチェックできる「転送完了」ファイルを作成します。
注:ダウンロードが完了する前にプログラムがファイルの最後に到達することについては、あまり心配していません。ファイルは、プログラムがデータを処理するよりも速くダウンロードされています。
あなたは-本当に!他の転送が行われているという理由だけでネットワーク接続が通常より遅い場合はどうなりますか?この場合、データを失っても大丈夫ですか?
これはパイプライン化の良い候補かもしれません。標準出力に書き込むFTPクライアントを使用して、分割プログラムを標準入力から読み取ります。