是否可以在不下载的情况下获取S3存储桶中未压缩和压缩的.gz文件大小?
我在S3上有大约750个.gz文件,从650MB到1.2 GB不等,我希望得到压缩和未压缩的聚合文件大小。我可以这样做:
gzip -l *gz
但是我必须先下载它们,这样才能获得总尺寸。
答案 0 :(得分:1)
不,这是不可能的。 Amazon S3存储原始文件。它不提供处理文件的功能。
有必要下载和分析文件的内容。
将S3视为存储服务。它非常耐用和可靠,但它基本上只是一种存储服务。您想要对数据做的任何事情都必须在其他地方完成,就像数据存储在USB磁盘或NAS上一样。
可以只下载文件的特定范围,但您需要知道该文件的哪个部分包含有关文件未压缩大小的信息。
答案 1 :(得分:0)
实际上这是可能的,您只需要部分下载文件,我就用goofys(https://github.com/kahing/goofys)来安装S3并对其进行测试,并且效果很好。他们只扫描文件的一部分,因此不会完全下载文件。可能s3保险丝也可以使用(https://github.com/s3fs-fuse/s3fs-fuse)。
答案 2 :(得分:0)
为此找到的最好方法是:
aws s3 cp s3://some_bucket/some_file.csv.gz - | zcat | wc -c
这会将文件流传输到标准输出(通过指定-
作为目的地),然后将其通过管道传输到zcat
以对其进行解压缩,然后wc -c
对字节进行计数。
我试图找到一种方法来获取s3中gzip的未压缩大小,而不必对其进行解压缩(类似于gzip -l
在Linux中的工作方式),但我仍然没有t想出了一种方法。 但是,这确实可以完成任务,而无需下载文件到本地存储。我认为这是OP的目标。
答案 3 :(得分:0)
是的。这是因为gzip(模2 ^ 32)的未压缩大小存储在last 4 bytes of the file中。使用Python,这将为您提供所需的东西。请注意,只有在您的未压缩文件小于4 GB的情况下,此方法才起作用,否则它将以4 GB的倍数关闭。
import boto3
import struct
def get_unpacked_size_s3_gz(bucket, key):
s3_client = boto3.client("s3")
compressed_size = s3_client.get_object(Bucket=bucket, Key=key)["ContentLength"]
last_four_bytes = s3_client.get_object(
Bucket=bucket,
Key=key,
Range=f"bytes={compressed_size-4}-{compressed_size}"
)["Body"]
return struct.unpack("I", last_four_bytes.read(4))[0]