求助:如何在VM实例的Jupyter Notebook加载GCS上的pickle文件
解决Google Cloud Storage中Pickle文件在Jupyter Notebook的加载问题
首先,你之前的方法行不通的核心原因是:pickle.load() 配合 open() 只能读取本地文件系统的文件,或者实现了文件协议的路径,而HTTP/HTTPS URL并不被open()支持——虽然有些库(比如加载.mat文件的库)内部封装了HTTP请求逻辑,但pickle模块没有这个能力。
下面是正确的实现步骤,基于官方的google-cloud-storage库:
1. 安装依赖库
在Jupyter Notebook中先执行安装命令:
!pip install google-cloud-storage
2. 编写加载代码
你可以直接从GCS读取文件内容到内存,再用pickle加载,不需要下载到本地:
import pickle from google.cloud import storage from io import BytesIO # 初始化GCS客户端(GCP VM实例默认会自动使用关联的服务账号权限,无需额外认证) client = storage.Client() # 指定你的存储桶名称和pickle文件路径 bucket_name = "<你的存储桶名称>" file_name = "<你的pickle文件名>.p" # 获取存储桶和文件对象 bucket = client.get_bucket(bucket_name) blob = bucket.blob(file_name) # 将文件内容读取到BytesIO对象(模拟文件流) with BytesIO() as byte_stream: blob.download_to_file(byte_stream) byte_stream.seek(0) # 重置流指针到开头 data_x = pickle.load(byte_stream)
3. 权限验证
如果运行时提示权限错误,需要确认你的VM实例关联的服务账号拥有存储对象查看者(roles/storage.objectViewer)权限,或者针对该存储桶的读取权限:
- 进入GCP控制台的存储桶页面
- 点击“权限”标签
- 添加你的VM服务账号(格式一般是
[服务账号名]@[项目ID].iam.gserviceaccount.com),并赋予对应的读取权限
为什么之前的方法对.mat/.pts有效?
那些格式的加载库(比如scipy.io.loadmat)内部实现了HTTP请求逻辑,会先把远程文件下载到内存再解析,但pickle模块本身没有这个封装,所以必须手动处理远程文件的读取。
另外,不建议使用公开链接的方式加载文件,这会带来安全风险,而且官方库的方式更稳定、可维护。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

