2017-08-10 63 views
5

我的API服務器的磁盤空間(500MB)和內存(1GB)非常有限。它獲得的API調用之一是接收文件。消費者調用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

一旦您能夠從第一個curl過程的標準輸出的輸出中發佈上傳流,如果由於下載速度快於上傳速度而導致內存不足,請查看mbuffer實用程序。我自己並沒有使用它,但它似乎是專門爲這類問題而設計的。

最後,如果一切都失敗了,我想你可以使用curl的--limit-rate選項來鎖定上傳和下載的傳輸速率到一些相同和可持續的值。這可能沒有充分利用帶寬,並且不能很好地利用多個並行下載/上傳流來擴展,但對於某些一次性批處理,這可能足夠好。

相關問題