2017-08-10 3 views
5

APIサーバーには、ディスク容量(500MB)とメモリー(1GB)が非常に限られています。取得するAPI呼び出しの1つは、ファイルを受信することです。消費者はAPIを呼び出し、ダウンロードするURLを渡します。サーバー間でcurlを使用してファイルをストリームする方法(サーバーリソースが限定されています)

私のサーバーの「目標」は、このファイルをAmazon S3にアップロードすることです。残念ながら、私は消費者にファイルを直接S3にアップロードするよう要求することはできません(要件の一部)。

問題は、巨大なファイル(10GB)をディスクに保存してから、S3にアップロードすることがオプションではない(500MBのディスク容量の上限)ことです。

私の質問は、curl Linuxプログラムを使用して入力URLからS3にファイルを "パイプ"することができますか?

注:私はさまざまな方法でパイプすることができましたが、最初にファイル全体をダウンロードしようとすると失敗するか、メモリエラーが発生し、カールが終了します。私の推測では、ダウンロードはアップロードよりもはるかに速いので、10GBのファイルを取得すると、パイプバッファ/メモリが大きくなり、爆発します(サーバー上で1GBのメモリ)。

カールとパイピングを使って何をしようとしているのかを達成する方法はありますか?

は、 をありがとう - ジャック

+0

サーバーはどのように実装されていますか?ほとんどのプログラミング言語では、一度にメモリに余りに多くのデータを保存しないように、コード内で「ストリーム・イン/ストリーム・アウト」することができます。それがオプションでない場合は、インスタンスに適度なサイズのEBSボリューム(100GBなど)を追加し、一時的なステージング領域として使用することをお勧めします。 – stdunbar

+0

@stdunbar - あまりにも多くの内部細部に入ることなく、私はカールを "呼び出す"ことを好み、仕事をします。それが実現可能であれば、素晴らしい!もしそうでなければ、私は他の方法を理解しなければならず、私はあなたの提案を取ります。タイ – Joe

答えて

0

は、別のSOユーザーは、標準入力からカールの記事について同様の質問をしました。 use pipe for curl dataを参照してください。

最初のカールプロセスの標準出力の出力からアップロードストリームを投稿できたら、アップロードできる速度よりも速くダウンロードしているためにメモリが不足している場合は、mbufferユーティリティを参照してください。私は自分で使ったことはありませんが、まさにこの種の問題のために設計されているようです。

最後に、他のすべてがうまくいかない場合は、curlの--limit-rateオプションを使用して、アップロードとダウンロードの転送レートを同じで持続可能な値にロックすることができると思います。これは、帯域幅を十分に活用していない可能性があり、複数のパラレルダウンロード/アップロードストリームではうまく拡張できませんが、一部の一回限りのバッチ処理では十分です。

関連する問題