Как установить начальный индекс для ObjectWriteStream? - PullRequest
3 голосов
/ 06 ноября 2019

Я пытаюсь создать соединение с файлом в хранилище Google, но мне сложно реализовать 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. Буду признателен, если кто-нибудь сможет мне посоветовать.

Ответы [ 3 ]

4 голосов
/ 06 ноября 2019

удалит старый файл и начнет с начала.

Это сделано специально. Помните, что GCS не является файловой системой . GCS - это хранилище объектов. В хранилище объектов объект является атомарной единицей. Вы не можете изменять объекты.

Если вам требуется семантика файловой системы, вы можете использовать Облачное хранилище файлов .

4 голосов
/ 06 ноября 2019

Ответы, указывающие на то, что объекты неизменны, верны. Однако два или более объектов можно объединить вместе с помощью API compose . Вот соответствующий javadoc .

Так что вы можете объединить несколько методов для эффективного добавления к объектам в GCS.

  • Вы можете скопировать свой существующий объект(A) для нового объекта (B) в том же месте и классе хранения (это будет очень быстро), удалите A, загрузите новые данные в объект C, а затем составьте B + C в исходное местоположение A. Затем удалите B и C. Для этого потребуется скопировать, удалить, загрузить, создать, а затем два удаления - так шесть операций. Помните о операционных расходах .

  • Вы можете просто загрузить новый объект (B) и составить A + B в новый объект C и записать имянового объекта в базе метаданных, если вы его используете. Это потребует только загрузки, создания и двух удалений.

1 голос
/ 06 ноября 2019

В облачном хранилище Google объекты неизменны. См .:

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

Это означает, что вы просто не можете добавить файл. Вы можете переписать файл, передав исходный контент, а затем добавить дополнительный контент.

...