使用 Google Cloud 读取和写入 pickle

Ale*_*ier 3 python pickle bucket google-cloud-platform google-cloud-functions

我想读取存储在 Google Cloud Bucket 内的文件夹中的现有 pickle(包含字典)。然后执行一些功能后更新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()
Run Code Online (Sandbox Code Playgroud)

现在我需要在 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()
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*vid 11

从 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)

Run Code Online (Sandbox Code Playgroud)