python - 在 python 中处理非常大的 netCDF 文件

标签 python numpy netcdf

我正在尝试处理来自非常大的 netCDF 文件(每个约 400 Gb)的数据。每个文件都有一些变量,都比系统内存大得多(例如 180 Gb 与 32 Gb RAM)。我正在尝试使用 numpy 和 netCDF4-python 通过一次复制一个切片并对该切片进行操作来对这些变量执行一些操作。不幸的是,读取每个切片需要很长时间,这会降低性能。

例如,其中一个变量是形状为 (500, 500, 450, 300) 的数组。我想对切片 [:,:,0] 进行操作,所以我执行以下操作:

import netCDF4 as nc

f = nc.Dataset('myfile.ncdf','r+')
myvar = f.variables['myvar']
myslice = myvar[:,:,0]

但最后一步需要很长时间(在我的系统上大约 5 分钟)。例如,如果我在 netcdf 文件中保存了一个形状为 (500, 500, 300) 的变量,那么读取相同大小的操作只需几秒钟。

有什么办法可以加快速度吗?一个明显的路径是转置数组,以便我选择的索引首先出现。但是在这么大的文件中,这不可能在内存中完成,而且考虑到一个简单的操作已经需要很长时间,尝试它似乎更慢。我想要的是一种以 Fortran 接口(interface) get_vara 函数的方式快速读取 netcdf 文件片段的方法。或者一些有效转置数组的方法。

最佳答案

您可以使用 nccopy 实用程序转置太大而无法放入内存的 netCDF 变量,此处记录了该实用程序:

http://www.unidata.ucar.edu/netcdf/docs/guide_nccopy.html

想法是通过指定 block 的形状(多维图 block )来“重新分 block ”文件 你想要的变量。您可以指定将多少内存用作缓冲区以及将多少内存用作缓冲区 用于 block 缓存,但不清楚如何在这些用途之间最佳地使用内存,所以你 可能只需要尝试一些示例并为它们计时。而不是完全转置一个变量, 您可能希望通过指定包含大量数据的 block 来“部分转置”它 切片的 2 个大维度,其他维度只有几个值。

关于python - 在 python 中处理非常大的 netCDF 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12067876/

相关文章:

python - 正则表达式操作截掉第一个字母

python - 从 Flask 蓝图访问数据库

python - 使用 Python-Xarray 重新网格化坐标

python - 使用 python 将不规则间隔的地理引用二维数组写入 netcdf

Python:来自多个线程(或信号)的 Queue.get()

python - 在 python 中将一个文本文件聚类为组和主题

python - 将值列表舍入到 python 中另一个列表中最接近的值

python - 编码德语算法

python - 贪心算法、numpy、矩阵、外植

python - 根据时间从NETCDF(.NC文件)中提取数据