【问题标题】:Notebook kernel dies when saving multiple netCDF files with xarray使用 xarray 保存多个 netCDF 文件时,笔记本内核死机
【发布时间】:2019-12-10 01:13:12
【问题描述】:

当尝试在 Jupyter 笔记本中将多个 xarray 数据集保存到 netCDF 时,内核不断死机,同时输出以下异常,提示文件未正确关闭。

在这里,我尝试保存通过 OpenDAP 链接和 xarray 打开的 NASA-NEX 数据子集。然后我想将多个 NEX 模型连接到一个集成数据集中。以下函数执行此操作:

for var in variables:
        for path in scenarios:
            for model in models:
                try:
                    time_range = slice(time_start, time_end)
                    data = xr.open_dataset(f'https://dataserver.nccs.nasa.gov/thredds/dodsC/bypass/NEX-GDDP/bcsd/{path}/'
                                          f'r1i1p1/{var}/{model}.ncml').sel(lon=longitudes, lat=latitudes, time=time_range)
                    print(var, path, model, 'success')
                    data.to_netcdf(path=f'{var}_{path}_{model}.nc')
                    print(f'Saved {model}')
                    data.close()
                except TypeError:
                    time_range = slice(cftime.DatetimeNoLeap(time_start.year,time_start.month,time_start.day), 
                                       cftime.DatetimeNoLeap(time_end.year,time_end.month,time_end.day))
                    data = xr.open_dataset(f'https://dataserver.nccs.nasa.gov/thredds/dodsC/bypass/NEX-GDDP/bcsd/{path}/'
                                          f'r1i1p1/{var}/{model}.ncml').sel(lon=longitudes, lat=latitudes, time=time_range)
                    new_timeindex = data.indexes['time'].to_datetimeindex()
                    data['time'] = new_timeindex
                    del new_timeindex
                    print(var, path, model, 'success w/ no leap')

                #if save_netcdf:
                    # Now save data to netCDF
                    #data.to_netcdf(path=f'{var}_{path}_{model}.nc')
                    #print(f'Saved {model}')
                    #data.close()

            print('Concatenating models into ensemble')
            data_final = xr.open_mfdataset(f'{var}_{path}_*.nc', combine='nested', concat_dim='model')
            data_final.to_netcdf(path=f'{var}_{path}_ensemble.nc')
    return data_final

在运行时,每个文件都会抛出以下异常,但不会阻止代码运行:

Exception ignored in: <function CachingFileManager.__del__ at 0x31f530b00>
Traceback (most recent call last):
  File "/Users/Zach_Bruick/opt/miniconda3/envs/climate2/lib/python3.7/site-packages/xarray/backends/file_manager.py", line 243, in __del__
    self.close(needs_lock=False)
  File "/Users/Zach_Bruick/opt/miniconda3/envs/climate2/lib/python3.7/site-packages/xarray/backends/file_manager.py", line 221, in close
    file.close()
  File "netCDF4/_netCDF4.pyx", line 2276, in netCDF4._netCDF4.Dataset.close
  File "netCDF4/_netCDF4.pyx", line 2260, in netCDF4._netCDF4.Dataset._close
  File "netCDF4/_netCDF4.pyx", line 1754, in netCDF4._netCDF4._ensure_nc_success
RuntimeError: NetCDF: cannot delete file

我可以看到我的记忆随着每个文件的保存而逐渐增加。这是一个错误还是我在其中泄漏了内存?

【问题讨论】:

    标签: python jupyter-notebook netcdf python-xarray


    【解决方案1】:

    我想我遇到了完全相同的问题。我敢打赌,您安装的 libnetcdf 版本是 >=4.7.1。尝试将版本固定到 4.6.2。

    我不完全确定,但似乎有一个非常微妙的回归。

    当我只有一个文件,或者当我没有将结果保存到 netcdf 到磁盘时,它不会发生,它只发生在 OpenDAP 链接中。

    编辑:我在 GitHub https://github.com/Unidata/netcdf4-python/issues/982 上找到了相关问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-05
      • 1970-01-01
      • 2014-11-27
      • 2018-04-23
      • 1970-01-01
      • 1970-01-01
      • 2015-10-05
      • 2021-08-12
      相关资源
      最近更新 更多