java 压缩大文件(>15GB)并上传到S3,无需OOM

iyfjxgzm  于 2023-02-11  发布在  Java
关注(0)|答案(2)|浏览(250)

压缩大型文件/文件夹时,我遇到一个内存问题(结果zip〉15 GB)并上传到S3存储。我可以在光盘中创建zip文件并附加文件/文件夹,我上传了一个文件到S3。但是根据我的经验,这不是解决这个问题的好方法。你知道压缩大文件/文件夹并上传到S3而没有内存问题的好模式吗(这样的OOM)?如果我能把这些文件/文件夹直接附加到一些上传的zip中,那就太好了。
将文件/文件夹压缩到磁盘,然后将该压缩文件按部分上传到S3。

yqkkidmi

yqkkidmi1#

👋
得到OOM的主要原因是zlib的deflate算法是如何工作的。
想象一下这个设置:

1.它通过打开一个可读流开始读取整个文件。
1.它从一开始就创建一个0字节的临时输出文件。
1.然后,它以块的形式读取数据(称为dictionary size),然后将其发送到CPU进行进一步处理和压缩,然后再传播回RAM。
1.当它完成某个固定大小的字典时,它移动到下一个字典,依此类推,直到到达文件结束符。
1.然后,它从RAM中获取所有紧缩的字节(压缩的)并将其写入实际文件。
您可以通过启动一个deflate操作来观察和推断这种行为,下面是一个示例。

  • (创建文件,处理372 mb,但直到最后一个处理的字节才写入文件。)*

从技术上讲,你可以抓取所有的部分,将它们再次归档到tar.gz中,然后作为一个文件上传到AWS,但是你可能会遇到同样的内存问题,但是现在是上传部分。
以下是文件大小限制:
https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html
如果您使用CLI,从技术上讲您可以做到这一点,如果您需要或必须使用REST API,这不是您的一个选项,因为限制是每个请求只有5GB。
此外,您还没有指定最大大小,所以如果它甚至大于160 GB,这不是一个选项,甚至使用AWS CLI(它负责在每个上传块后释放内存)。所以您最好的选择是多部分上传。
https://docs.aws.amazon.com/cli/latest/reference/s3api/create-multipart-upload.html
一切顺利!

bvhaajcl

bvhaajcl2#

你可以使用AWS Lambda来压缩你的文件,然后再上传到S3 bucket。你甚至可以配置Lambda to be triggered and zip your files on upload。下面是一个用于压缩大文件的Lambda函数的Java example。这个库被限制为10 GB,但是可以通过使用EFS来克服。
Lambda的ephemeral storage is limited to 10 GB,但是你可以附加EFS storage来处理更大的文件。如果你在使用后删除文件,成本应该接近于零。
另外,当上传大于100 MB的文件到S3时,请记住使用Multipart Upload。如果您使用SDK,它应该会为您处理此问题。

相关问题