如何从Azure DataStore中提取已保存的numpy数组?
解决方案
问题根因
直接对
self.datastore做字符串转换得到的是Azure存储资源的HTTPS访问链接,np.DataSource默认不携带Azure访问凭证,无法读取私有存储资源,且np.fromfile对HTTP类的流读取兼容性差,同时np.fromfile本身不适配npy格式的结构化二进制文件,才会出现定位失败、格式不符合预期的问题。
方案1:通过Azure ML Datastore下载到本地临时目录读取(适配Azure ML环境)
该方案无需额外处理存储凭证,直接复用现有Datastore的权限,操作最稳妥:
import numpy as np import os import tempfile # 构造目标文件在datastore中的相对路径 target_file_path = f"{self.train_data_outputs_folder}/w2v_emb_{str(self.date_range)}.npy" # 下载文件到临时目录,自动销毁无需手动清理 with tempfile.TemporaryDirectory() as tmpdir: self.datastore.download( target_path=tmpdir, prefix=target_file_path, overwrite=True ) local_file_path = os.path.join(tmpdir, target_file_path) # 用np.load读取npy格式,不要用np.fromfile dat = np.load(local_file_path)
方案2:直接读取Blob内容到内存,无本地落地
如果不需要本地留存文件,可以直接读取Blob内容到内存流加载:
from azure.storage.blob import BlobClient import numpy as np from io import BytesIO # 构造Blob访问链接,自动处理路径首尾的斜杠 blob_url = f"{str(self.datastore).rstrip('/')}/{self.train_data_outputs_folder.lstrip('/')}/w2v_emb_{str(self.date_range)}.npy" # 传入你持有的访问凭证(SAS令牌、存储账户密钥均可) blob_client = BlobClient.from_blob_url(blob_url, credential="你的访问凭证") # 读取到内存流 byte_stream = BytesIO(blob_client.download_blob().readall()) # 直接从内存流加载npy数组 dat = np.load(byte_stream)
注意事项
- npy格式自带数组维度、数据类型等头信息,必须使用
np.load读取,np.fromfile仅适用于读取无格式的纯二进制数据,强行使用会出现数据错乱 - 访问私有存储资源时必须携带合法凭证,避免出现403/404访问错误
内容的提问来源于stack exchange,提问作者ricardo
相关产品推荐
相关产品推荐

