V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
AboPlus
V2EX  ›  程序员

想请教各位大佬一个问题,关于从云端获取大文件中的一部分

  •  
  •   AboPlus · 2023-10-20 10:33:19 +08:00 · 1309 次点击
    这是一个创建于 402 天前的主题,其中的信息可能已经有所发展或是发生改变。

    ​ 先描述下业务场景,业务是有提交任务给求解器进行计算,计算结果是一批 bin 文件,但是这批 bin 文件的数量可能会非常的多,对这些文件不清楚该如何进行管理,经过调研发现 HDF5 恰好适合用在此处,就想着把这批 bin 文件数据都写在 HDF5 文件中,这样一个任务的计算结果只需要一个文件便能存储下来,然后我们使用云存储是腾讯的对象存储 COS ,在将 HDF5 文件存储到云端后发现,如果只需要该文件的一部分数据而不是全部数据,也需要将该文件全部下载下来。

    ​ 对于这种场景,各位大哥们有没有一些什么思路,一些气象的业务场景应该和我这个场景很类似,关键点就是既需要将大量 bin 文件集中管理又在需要的时候仅获取需要的部分

    11 条回复    2023-10-21 22:39:51 +08:00
    xhatt
        1
    xhatt  
       2023-10-20 10:44:21 +08:00   ❤️ 1
    对于你描述的场景,如果你想要实现在需要时只下载文件的一部分,可以考虑使用 HTTP 分片下载的技术。

    HTTP 分片下载是一种允许客户端只请求文件的部分内容的机制,这对于大文件或者只需要部分数据的情况非常有用。

    在 HTTP 请求中,可以使用 Range 头部来指定需要下载的数据范围。服务器在收到这个请求后,会返回指定范围的数据。

    以下是一个简单的示例:

    http
    Copy code
    GET /path/to/file HTTP/1.1
    Host: example.com
    Range: bytes=0-999
    上述请求表示客户端只请求文件的前 1000 字节。服务器会返回一个包含这 1000 字节的响应。

    如果你使用的是某种云存储服务(比如腾讯的 COS ),它们通常会支持这种方式。你可以查看相应的文档以了解如何在请求中设置 Range 头部。

    需要注意的是,服务器是否支持分片下载取决于服务器的配置和支持情况。因此,在实施之前最好先确认一下你使用的存储服务是否支持这个功能。

    另外,你的应用程序也需要能够处理分片下载,这可能需要一些相应的编程工作,确保你的程序能够正确地处理和组装从服务器获取的分片数据。
    AboPlus
        2
    AboPlus  
    OP
       2023-10-20 11:07:34 +08:00
    @xhatt 蟹蟹大哥回复,HDF5 应该不适合使用分片下载,这个问题可能换个描述更加准确:HDF5 如何和云存储一起使用
    okakuyang
        3
    okakuyang  
       2023-10-20 11:39:54 +08:00 via iPhone   ❤️ 1
    文件不都是字节吗?只要能解析 hdf5 的文件格式,读取记录文件列表那部分字节,再解析出对应文件在整个 hdf5 文件中的字节位置字节长度,就可以把需要的 bin 文件下载下来啊。除非中间是加密的,没法解密,或者成本太高。 还要你的云存储支持分片下载。
    actar
        4
    actar  
       2023-10-20 13:01:56 +08:00   ❤️ 1
    https://cloud.tencent.com/document/product/436/7753

    查看请求头部分的 Range 字段
    actar
        5
    actar  
       2023-10-20 13:31:52 +08:00
    审错题了,不知道你用的什么语言和库。COS 可以分片下载,可以考虑把 COS 文件的操作封装成一个 HDF5 文件操作的适配器。但是不知道你具体使用的库支不支持。
    blankmiss
        6
    blankmiss  
       2023-10-20 15:47:50 +08:00
    我怀疑 1 楼是 gpt 的回复
    tool2d
        7
    tool2d  
       2023-10-20 15:58:06 +08:00   ❤️ 1
    用扁平化的结构的文件容器,比如没压缩的 ZIP ,可以分文件用 range 来单独下载处理。

    HDF5 是层次结构文件容器,不太好单独提取某个文件。
    AboPlus
        8
    AboPlus  
    OP
       2023-10-20 16:30:47 +08:00
    @xhatt
    @okakuyang
    @actar
    感谢大哥们的回复,反馈下结果:首先分片下载这个机制是没问题的,有问题的是 HDF5 里面存储数据的偏移量提取不出来,也就导致没办法准确的从远端下载下来,刚才试了下只用 HDF5 存储元数据,真正的结果数据全存储在一个 bin 文件中,发现可行,但估计还有坑,我再试试
    AboPlus
        9
    AboPlus  
    OP
       2023-10-20 16:32:29 +08:00
    @tool2d 是的,HDF5 这个层次结构确实不好单独提取某个文件,没压缩的 ZIP ?我调研下是什么操作哈,这个之前没接触过
    xhatt
        10
    xhatt  
       2023-10-20 16:57:16 +08:00
    @blankmiss 对的 是 它 写的,我知道有 range 这东西,让 它 帮忙完善了一下。
    blankmiss
        11
    blankmiss  
       2023-10-21 22:39:51 +08:00
    @xhatt 别在 V2EX 发这个会被 ban
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1030 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 20:07 · PVG 04:07 · LAX 12:07 · JFK 15:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.