无需下载即可在S3上获取未压缩的.gz文件大小

时间:2017-01-29 20:45:07

标签: amazon-s3 gzip

是否可以在不下载的情况下获取S3存储桶中未压缩和压缩的.gz文件大小?

我在S3上有大约750个.gz文件,从650MB到1.2 GB不等,我希望得到压缩和未压缩的聚合文件大小。我可以这样做:

gzip -l *gz

但是我必须先下载它们,这样才能获得总尺寸。

4 个答案:

答案 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]