Запись рисунка в Google Cloud Storage вместо локального диска

Каждая переменная в python (например, как dict1 или str или __builtins__ является указателем на некоторый скрытый платонический «объект» внутри машины.

Если вы установите dict1 = dict2, вы просто укажите dict1 на тот же объект (или местоположение памяти или любую другую аналогию, которая вам нравится), как dict2. Теперь объект, на который ссылается dict1, является тем же объектом, на который ссылается dict2.

Вы можете проверить: dict1 is dict2 должен быть True. Кроме того, id(dict1) должен быть таким же, как id(dict2).

Вы хотите dict1 = copy(dict2) или dict1 = deepcopy(dict2).

Разница между copy и deepcopy? deepcopy гарантирует, что элементы dict2 (вы указали его в списке?) также являются копиями.

't использовать deepcopy много - это, как правило, плохая практика писать код, который ему нужен (на мой взгляд).

1
задан Joan Grau 17 January 2019 в 11:51
поделиться

1 ответ

Вы не можете напрямую загрузить файл в Google Cloud Storage с помощью функции python open (которая используется matplotlib.pyplot.savefig за кулисами). Вместо этого вам следует использовать клиентскую библиотеку Cloud Storage для Python . Обратитесь к этой документации для подробностей о том, как эта библиотека используется. Это, среди прочего, позволит вам манипулировать файлами и загружать / скачивать их в GCS.

Вам нужно будет импортировать эту библиотеку, чтобы использовать ее, вы можете установить ее, запустив pip install google-cloud-storage и импортировать ее как from google.cloud import storage.

Кроме того, поскольку plt.figure является объектом, а не фактическим изображением .png, которое вы хотите загрузить, вы также не можете напрямую загрузить его в Google Cloud Storage.

Однако вы можете выполнить одно из следующих действий:

Вариант 1 : сохранить изображение локально, а затем загрузить его в облачное хранилище Google:

[1118 ] Используя ваш код:

from google.cloud import storage

def saving_figure(path_logdir):
    data = np.arange(0, 21, 2)
    fig = plt.figure(figsize=(20, 10))
    plt.plot(data)
    fig.savefig("your_local_path/accuracy_loss_graph.png".format(path_logdir))
    plt.close()


    # init GCS client and upload file
    client = storage.Client()
    bucket = client.get_bucket('skin_cancer_mnist')
    blob = bucket.blob('logs/20190116-195604/accuracy_loss_graph.png')  # This defines the path where the file will be stored in the bucket
    your_file_contents = blob.upload_from_filename(filename="your_local_path/accuracy_loss_graph.png")

Вариант 2 : сохраните результат изображения из рисунка в переменную, затем загрузите его в GCS в виде строки (из байтов):

Я нашел следующий ответ StackOverflow, который, кажется, сохраняет изображение фигуры в байтовую строку .png, однако сам не пробовал.

Опять же, основываясь на вашем коде:

from google.cloud import storage
import io
import urllib, base64

def saving_figure(path_logdir):
    data = np.arange(0, 21, 2)
    fig = plt.figure(figsize=(20, 10))
    plt.plot(data)
    fig_to_upload = plt.gcf()

    # Save figure image to a bytes buffer
    buf = io.BytesIO()
    fig_to_upload.savefig(buf, format='png')
    buf.seek(0)
    image_as_a_string = base64.b64encode(buf.read())

    # init GCS client and upload buffer contents
    client = storage.Client()
    bucket = client.get_bucket('skin_cancer_mnist')
    blob = bucket.blob('logs/20190116-195604/accuracy_loss_graph.png')  # This defines the path where the file will be stored in the bucket
    your_file_contents = blob.upload_from_string(image_as_a_string, content_type='image/png')

Редактировать : Оба варианта предполагают, что среда, из которой вы запускаете скрипт, имеет Cloud SDK установлена ​​и активирована учетная запись с аутентификацией в Google Cloud (если у вас ее нет, вы можете проверить эту документацию , в которой объясняется, как это сделать).

0
ответ дан Joan Grau 17 January 2019 в 11:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: