2017-08-10 33 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选项来锁定上传和下载的传输速率到一些相同和可持续的值。这可能没有充分利用带宽,并且不能很好地利用多个并行下载/上传流来扩展,但对于某些一次性批处理,这可能足够好。

相关问题