【问题标题】:Download only a range of bytes or a specific file from a TAR archive in S3仅从 S3 中的 TAR 存档下载一定范围的字节或特定文件
【发布时间】:2019-07-06 12:44:42
【问题描述】:

试图确定是否可以从 S3 中的未压缩 TAR 存档中下载特定文件或字节范围。

用例可以这样描述:

  • TAR 文件由我的应用程序生成(因此我们可以控制它)
  • TAR 文件位于 S3 存储桶中
  • TAR 文件名为archive.tar
  • TAR 文件包含两个文件:metadata.txt 和 payload.png
  • metadata.txt 保证总是大小为“n”字节,其中“n”相对较小
  • payload.png 可以是任意大小,因此可以是一个非常大的文件 (> 1 GB)
  • 我的应用程序需要能够下载 metadata.txt 以了解如何处理 TAR 文件,并且我不希望应用程序必须仅为 metadata.txt 文件下载整个 TAR 文件

理想情况下,在任何时候,我都应该只在内存中打开 metadata.txt 文件,而不是打开整个 TAR 存档或 payload.png 的任何部分。我不想为了能够读取包含的小 metadata.txt 文件而下载巨大的 TAR 存档而产生网络或内存开销。

我注意到 AWS 开发工具包中的 S3ObjectInputStream,但我不确定如何将它与 TAR 文件一起用于我的用例。

任何人曾经实现过类似的东西或有任何指向我可以查看以帮助解决此问题的参考的指针吗?

【问题讨论】:

  • 是的,您可以在“获取对象”请求中指定所需的字节范围。只要您对 TAR 文件的内容有某种索引并且它没有被压缩或加密,听起来就可以工作。
  • 只有一个问题——为什么这么复杂? TAR 不压缩文件;因此,如果您需要单独处理它的内容,将这些文件放在单独的目录中并逐个处理它们非常简单。不是吗?

标签: java amazon-web-services amazon-s3 download tar


【解决方案1】:

是的,可以使用未压缩的 tarball,file format 包含有关文件的标头记录,可用于检查其内容。

我更喜欢 Python 而不是 Java 人,但请看看我对 tarball 范围请求 heredocs here 的实现。

总之可以查看header(文件名总是在前,用NULLb"\x00"字节填充到512字节块),得到文件长度对应的范围来确定变长,得到该文件长度的剩余部分 512 以确定文件结尾填充,然后在文件结尾之前迭代到 1024(您可以发送 HEAD 请求以获取总字节数,或者在执行时将其发回范围请求,AKA 部分内容请求)。 1024-before-the-end 部分是因为 tar 归档文件末尾至少有 2 个 512 字节的空块。

在迭代时,检查您希望在其中找到文件头的每个新块的文件名是否实际上都是 NULL 字节可能是明智的,因为这表明您实际上已经输入了文件结尾块之一(规范似乎说“至少有 2 个空块”,所以可能还有更多)。但如果你控制生成的 tar 文件,也许你就不需要费心了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 2022-11-10
    • 2020-04-24
    • 2021-07-22
    • 1970-01-01
    • 2021-11-23
    相关资源
    最近更新 更多