【问题标题】:How to set the starting index for an ObjectWriteStream?如何设置 ObjectWriteStream 的起始索引?
【发布时间】:2020-03-03 08:26:00
【问题描述】:

我正在尝试与谷歌存储桶中的文件建立连接,但我很难实现ObjectWriteStream。问题是如果我为已经在云上的文件创建一个ObjectWriteStream,它将删除旧文件并从它的开头开始。这是一个示例代码

namespace gcs = google::cloud::storage;
void test(gcs::Client client, string bucket_name, string file_name){
    auto writeCon = client.WriteObject(bucket_name.c_str(), file_name.c_str());
    writeCon << "This is a test";
    writeCon.Close();
}

我应该怎么做才能防止ObjectWriteStream 删除我的文件并从我想要的位置上传数据(例如将数据附加到文件中)?我尝试调用标准 ostream 函数seekp 来设置流位置。这不起作用,因为ObjectWriteStream 不支持它。奇怪的是ObjectReadStream 也不支持此操作,但它有一个选项gcs::ReadRange(start, end) 来设置起始位置。因此,我想知道是否有一种非标准的方式来设置ObjectWriteStream 的位置。如果有人能给我建议,我将不胜感激。

【问题讨论】:

标签: google-cloud-platform google-cloud-storage


【解决方案1】:

它将删除旧文件并从它的开头开始。

这是设计使然。请记住,GCS 不是文件系统。 GCS 是一个对象存储。在对象存储中,对象是原子单位。您不能修改对象。

如果您需要文件系统语义,您可能希望改用Cloud Filestore

【讨论】:

  • 我看到了这两种产品之间的差异。 Cloud Filestore 完全符合我的需要,感谢您的建议!
【解决方案2】:

表明对象是不可变的答案是正确的。但是,两个或多个对象可以使用compose API 连接在一起。这是relevant javadoc

因此,您可以结合一些技术来有效地附加到 GCS 中的对象。

  • 您可以将现有对象 (A) 复制到相同位置和存储类中的新对象 (B)(这将非常快),删除 A,将新数据上传到对象 C,然后进行组合B+C 进入 A 的原始位置。然后删除 B 和 C。这将需要复制、删除、上传、撰写,然后是两次删除——总共六个操作。注意operations costs

  • 您可以简单地上传一个新对象 (B) 并将 A+B 组合成一个新对象 C,然后在元数据数据库中记录新对象的名称(如果您正在使用一个)。这只需要上传、撰写和两次删除。

【讨论】:

  • 通过ComposeObject()成员函数在Google Cloud Storage C++ Client中也可以使用相同的API。
  • 谢谢!你的回答很有帮助。正如另一个答案所说,云文件存储可能是一个更好的解决方案,但我很欣赏您的解决方案。
【解决方案3】:

在 Google Cloud Storage 中,对象是不可变的。见:

https://cloud.google.com/storage/docs/key-terms#immutability

这意味着你只是不能附加到一个文件。你可以重写传入原始内容的文件,然后添加更多内容。

【讨论】:

  • 谢谢,这是我忽略的。感谢您的信息。
猜你喜欢
  • 2014-07-02
  • 2011-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
相关资源
最近更新 更多