首页 > 解决方案 > 使用 Google Cloud 读写泡菜

问题描述

我想读取存储在 Google Cloud Bucket 内的文件夹中的现有泡菜(包含字典)。然后在执行完一些功能后更新pickle,相当于覆盖了pickle。

传统上我会做类似的事情:

import pickle
# Read pickle:
pickle_in = open('dictionary.pickle','rb')
my_dictionary = pickle.load(pickle_in)
my_dictionary 

# MODIFY DICTIONARY BY, FOR EXAMPLE, ADDING NEW REGISTERS

# Overwrite pickle:
pickle_out = open('dictionary.pickle','wb') 
pickle.dump(my_modified_dictionary,pickle_out)
pickle_out.close()

现在我需要在 Google Cloud 上做类似的事情。所以我需要更改文件的路径并使用cloudstorage.open():

import pickle
my_path = '/bucket_name/pickle_folder/my_dictionary.pickle'

# Read pickle:
pickle_in = cloudstorage.open(path,'r')
my_dictionary = pickle.load(pickle_in)
my_dictionary 

# MODIFY DICTIONARY BY, FOR EXAMPLE, ADDING NEW REGISTERS

# Overwrite pickle:
pickle_out = cloudstorage.open(path,'w') 
pickle.dump(my_modified_dictionary,pickle_out)
pickle_out.close()

这行得通吗?cloudstorage.open()似乎等同于 open()。但我不确定如果我在转储泡菜时指定路径,实际上会覆盖指定文件夹上的泡菜。

标签: pythongoogle-cloud-platformgoogle-cloud-functionspicklebucket

解决方案


从 GCS 进行读-修改-写的基本思想是可能的。您应该知道这不适用于并发 - 如果第二个进程在第一个写回之前进行读取,那么当第二个进程写回时,它将丢失第一个进程的更改。最好的解决方案是使用数据库而不是酸洗到 GCS。

此外,请注意pickle 不安全,您不应该加载不是您编写的 pickle。

如果您仍然想为此使用 GCS,您应该使用标准 GCS 客户端库,例如:

from google.cloud import storage

storage_client = storage.Client()

bucket = storage_client.bucket('your-gcs-bucket')
blob = bucket.blob('dictionary.pickle')
pickle_in = blob.download_as_string()
my_dictionary = pickle.loads(pickle_in)

# MODIFY DICTIONARY BY, FOR EXAMPLE, ADDING NEW REGISTERS

pickle_out = pickle.dumps(my_modified_dictionary)
blob.upload_from_string(pickle_out)


推荐阅读