如何在Python中直接从URL读取大型HDF5文件目录且无需Google Colab Pro
问题根因
你现有代码的逻辑是将整个1.2TB的HDF5文件一次性全部加载到Colab运行时内存中,而Colab免费版运行时可用内存仅为10~12GB,内存溢出会直接触发崩溃,该问题和是否开通Colab Pro没有直接关联,无需升级即可解决。
可行方案
采用S3流式读取+按需加载的逻辑,不需要拉取全量文件到本地,仅读取你需要的数据集片段即可,具体操作如下:
- 首先安装所需依赖
!pip install s3fs h5py h5netcdf xarray
- 流式访问S3公开桶的数据集
该数据集存放在公开可访问的AWS S3桶中,无需配置密钥即可直接访问,示例代码如下:
import s3fs import h5py import xarray as xr # 初始化匿名S3文件系统,匹配桶所在的区域 fs = s3fs.S3FileSystem(anon=True, client_kwargs={'region_name': 'us-west-2'}) # 流式打开HDF5文件,不会加载全量数据到内存 with fs.open('oedi-data-lake/building_synthetic_dataset/A_Synthetic_Building_Operation_Dataset.h5', 'rb') as f: # 方案1:用h5py按需读取指定字段 with h5py.File(f, 'r') as h5_file: # 仅读取你需要的子数据集切片即可,不要读取整个数组 # 示例:读取指定路径下前1000条数据 target_data = h5_file['/替换为你需要的数据集在H5内的路径'][:1000] print(target_data.shape) # 方案2:用xarray懒加载,配合分块仅在计算时拉取对应数据 ds = xr.open_dataset(f, engine='h5netcdf', chunks={}) # 后续对ds的操作仅会加载你用到的对应数据块,不会占满内存
- 遍历目录下的所有文件
如果你需要访问整个目录下的多个文件,可以用s3fs直接列取目录内容,不需要手动拼接URL:
# 列出数据集根目录下的所有文件/子文件夹 for path in fs.glob('oedi-data-lake/building_synthetic_dataset/*'): print(path)
注意事项
- 不要调用
resp.read()这类读取全量文件内容的方法,所有数据读取操作都按需求取切片 - 使用xarray时建议开启分块配置,基于dask的懒加载机制可以进一步降低内存占用
- 该方案完全适配Colab免费版的资源限制,无需升级Pro即可运行
内容的提问来源于stack exchange,提问作者Sal
相关产品推荐
相关产品推荐

