Google Cloud Storage 可以将字节范围写入现有对象吗?

Can Google Cloud Storage write byte ranges into an existing object?

Google Cloud Storage API 似乎不支持写入字节范围。有什么解决方法吗?

我正在考虑使用存储对象读取和写入 1000 个固定字节范围的设计,其中每个范围都是分区模式中的数据记录 (~1kb)。

例如,每个范围可能表示从给定开始时间开始一年中某一天的数据,客户端将通过读取偏移量来获取给定日期范围内的数据。

我可以看到我可以为每条记录使用一个存储对象,并且需要考虑读取许多小记录时批次限制(100 次调用)对性能的影响。

当然,云存储​​可能是错误的方法,数据库会更好地处理这个需求。然而,存储扩展似乎非常好(对于并行读取和写入),并且对于只需要回答非常特定类型的查询的大容量数据的长期存储(即通用数据库似乎是不必要的开销)也能很好地工作。

参考

Objects: insert

A Case for Packing and Indexing in Cloud File Systems

对象是不可变的,必须从头到尾按顺序写入。

如果您正在寻找并行上传的方法,可以使用 Object Composition or Multipart Uploads

Google Cloud Storage 是 Google Cloud Platform 的对象存储托管服务。与块存储或文件系统存储不同,存储的对象是不可变的。

Official documentation

中所述

对象是不可变的,这意味着上传的对象在其整个存储生命周期内不能改变。对象的存储生命周期是从成功创建对象(例如上传)到成功删除对象之间的时间。实际上,这意味着您不能对对象进行增量更改,例如追加操作或截断操作。但是,可以替换存储在 Cloud Storage 中的对象,并且这样做是原子发生的:在新上传完成之前,旧版本的对象将提供给读者,上传完成后,新版本的对象是服务于读者。因此,单个替换操作只是标记一个不可变对象生命周期的结束和新的不可变对象生命周期的开始。

作为解决方法,您可以尝试 对象组合

的概念
gsutil compose gs://bucket/source_obj1 [gs://bucket/source_obj2 ...] gs://bucket/composite_obj

这个操作基本上以新名称(例如,cat file1 file2 > newfile)连接同一个桶中的多个对象的内容,但不重写数据. 因此,您可以创建一个新对象,上传内容以附加到它,关闭并随后在主文件的末尾编写这个新片段。 但是,在单个操作中可以组合的组件数量存在限制(当前为 32 个)。

您可以从 Compose Documentation and documentation.

中探索更多关于对象组合的内容