如何使用curl从一个服务器流式传输文件到另一个服务器(有限的服务器资源)

6
我的API服务器的磁盘空间(500MB)和内存(1GB)非常有限。其中一个API调用是接收文件。消费者调用API并传递要下载的URL。
我的服务器的“目标”是将此文件上传到Amazon S3。不幸的是,我不能要求消费者直接将文件上传到S3(部分要求)。
问题是,有时这些是巨大的文件(10GB),将它们保存到磁盘然后上传到S3不是一个选项(500MB磁盘空间限制)。
我的问题是,如何使用curl Linux程序将文件从输入URL“管道”到S3?
注意:我能够以不同的方式进行管道处理,但是,它要么首先尝试下载整个文件并失败,要么遇到内存错误而curl退出。我猜测下载比上传快得多,因此当我获得10GB文件时,管道缓冲区/内存增长并爆炸(服务器上的1GB内存)。
是否有一种使用curl和管道实现我正在尝试做的事情的方法?
谢谢, - 杰克

你的服务器是如何实现的?大多数编程语言应该允许你在代码中进行“流式输入/输出”,这样你就不会一次性将太多数据存储在内存中。如果这不是一个选项,那么你最好的选择可能是向实例添加一个适度大小的EBS卷(比如100GB),并将其用作临时暂存区。 - stdunbar
@stdunbar - 不想深入讨论内部细节,我更喜欢“调用”curl并完成工作。如果可行,那太好了!如果不行,我将想出其他方法,并采纳您的建议。谢谢。 - Joe
1个回答

1

另一位SO用户提出了一个关于从stdin进行curl post的类似问题。请参见使用管道进行curl数据

一旦您能够从第一个curl进程的标准输出中发布上传流,如果您因为下载速度比上传速度快而耗尽内存,可以查看mbuffer实用程序。我自己没有使用过它,但它似乎专门针对这种问题设计。

最后,如果所有其他方法都失败了,我想您可以使用curl的--limit-rate选项将上传和下载的传输速率锁定为某些相同且可持续的值。这可能会浪费带宽,并且不适用于多个并行下载/上传流,但对于某些一次性批处理过程来说,可能已经足够好了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接