【问题标题】:Read AWS S3 GZIP Object using GetObjectRequest with range使用带范围的 GetObjectRequest 读取 AWS S3 GZIP 对象
【发布时间】:2020-05-28 11:49:36
【问题描述】:

我正在尝试读取一个大的 AWS S3 Compressed Object(gz)。我不想读取整个对象,想要部分读取它,以便我可以并行处理未压缩的数据 我正在使用带有“Range”标头的 GetObjectRequest 阅读它,我在其中设置字节范围。 但是,当我给出介于 (100,200) 之间的字节范围时,它会失败并显示“不是 GZIP 格式” 失败的原因是,AWS 请求返回一个流,但是当我将它解析为 GZIPInputStream 时它失败,因为“GZIPInputStream”需要第一个字节(GZIP_MAGIC = 0x8b1f)来确认它是 gzip,它不存在于流中。

   GetObjectRequest rangeObjectRequest = new GetObjectRequest(<<Bucket>>, <<Key>>).withRange(100, 200);
   S3Object object = s3Client.getObject(rangeObjectRequest);
   S3ObjectInputStream rawData = object.getObjectContent();
   InputStream data =  new GZIPInputStream(rawData);

谁能指导正确的方法?

【问题讨论】:

    标签: java amazon-web-services amazon-s3 gzip gzipstream


    【解决方案1】:

    GZIP 是一种压缩格式,其中文件中的每个字节都依赖于它之前的所有字节。这意味着您不能从文件中选择任意字节范围并理解它。

    如果您需要读取字节范围,则需要将其未压缩存储。

    您还可以创建自己的文件存储格式,将文件块存储为单独压缩的块。您可以使用 ZIP 格式执行此操作,其中存档中的每个文件都代表一个特定的块大小。但是您需要实现自己的 ZIP 目录阅读器才能使其正常工作。

    【讨论】:

    • 这是否意味着我无法读取 gzip s3 对象的字节范围内的数据? .我分块读取数据的目标是并行处理未压缩的数据。“如果您需要读取字节范围,则需要将其存储为未压缩。”不确定,如果我真的理解这个说法。我其实是想解压数据并处理它
    • @Maverick - 这正是它所暗示的。如果要从文件中读取字节范围,则需要解压缩该文件。所以你需要下载它,解压缩它,然后上传未压缩的版本。
    • 如果您在单个文件中处理 TB 级数据,并希望将其压缩以节省存储费用,您可以预先构建拆分并单独压缩它们。
    • 是的。似乎是这样。试图破解标题字节,但块很难解决。 jvns.ca/blog/2013/10/23/day-15-how-gzip-works
    猜你喜欢
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 2017-12-19
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 2012-10-22
    相关资源
    最近更新 更多