我正在研究HPC系统(NCAR's Cheyenne),并希望对大型NetCDF数据集(NCAR Large Ensemble)做一些事情。尽管阅读了Pangeo和dask / dask分发的文档,但我遇到了内存错误问题。
我想采取的步骤是:
xarray.open_mfdataset()
加载大量(全球,〜1800年的每日数据),多文件数据集到dasknumpy.nanpercentile()
或具有指定百分位值的dask DataFrame.quantile()
函数)对我来说,能够一次加载任何网格点的全时序列非常重要,因为滚动和和返回间隔的计算取决于整个时间段。
这是我一直试图做的代码片段(直到上面的第2步)。我在一个jupyter笔记本中运行它,我已经指定$TMPDIR
作为我的个人临时目录(在这个系统上,/glade/scratch/$USER/temp/
):
import xarray
import dask_jobqueue
import dask.distributed
import glob
## specify location of precipitation files, use glob to get list of them
PRECT_root = '/glade/collections/cdg/data/cesmLE/CESM-CAM5-BGC-LE/atm/proc/tseries/daily/PRECT/'
filename_list = sorted(glob.glob(PRECT_root + 'b.e11.B1850C5CN.f09_g16.005.cam.h1.PRECT.*.nc'))
## import multi-file data set
mfds = xarray.open_mfdataset(filename_list, chunks={'lat':12, 'lon':12})
mfds_data = mfds['PRECT']
## start cluster object
cluster = dask_jobqueue.PBSCluster(cores=36, memory='100 GB', project='UCLA0022', queue='regular', walltime='06:00:00', local_directory='/glade/scratch/$USER/temp/')
## create 30 workers (I've tried up to 70)
cluster.start_workers(30)
## attach client
client = dask.distributed.Client(cluster)
## create a rolling 30-day sum
mfds_data_30day_rolling_object = mfds_data.rolling(time=30, center=True)
mfds_data_30day_rolling_sum = client.persist(mfds_data_30day_rolling_object.sum())
即使我加载单个文件(不是完整的数据集),上面的最后一行代码也会通过dask仪表板完成,但最终该作业被系统杀死。 HPC管理员多次通过电子邮件发送我在登录节点上使用了太多内存,但我已经仔细指定了我的$TMPDIR
和local_directory
,而我却无法解决这个问题。
我对此有几个问题:
scatter()
和future,但内存问题仍然存在。)du -hs /glade/scratch/$USER/temp
)的磁盘使用情况时,似乎工作人员在sum()
和persist()
期间没有占用任何内存。在这种情况下,使用的内存究竟在哪里?我有一种感觉,如果我能学到这一点,我可以解决我的问题。
更多信息:client.scheduler_info()
确认我的scratch目录已经适当设置,并且在其中创建了worker-****文件,但文件夹大小仍然固定为32 KB。也许我的想法是关于local_directory
在PBSCluster()
函数中的设置是什么?这里有几个问题。我会试着指出你未来阅读的一些好路径:
mfds_data_30day_rolling_object.sum()
对象的总字节数,以确保在内存中保留是合理的。 Xarray文档可能对此有所帮助。