我有一个363个netcdf文件的目录,对应不同的时间(所有文件都有类似的内部结构,“时间”维度为1),每个270MB,总共大约100GB。我想在一个xarray中上传所有这些数据(使用dask数组和块)。似乎open_mfdataset是合适的解决方案,但我似乎没有正确地使用它,因为它非常慢。
# Import modules
import time
import numpy as np
import xarray as xr
from dask.distributed import Client
client = Client()
# Define variables of interest
vars = ['nitrogendioxide_tropospheric_column_qafiltered']
# Read data
start = time.time()
dir = '/data_directory/'
ds = xr.open_mfdataset('{}/*2019*.nc'.format(dir), engine='netcdf4', combine='nested', concat_dim='time', parallel=True)
ds.close()
print(' | size(ds)/duration = {:0.2f}GB / {:0.2f}s'.format(ds.nbytes / 1e9,time.time()-start))
执行此操作所需的时间为:size(ds)/duration=98.83GB/1746.73s
。为什么这么慢?
请注意,如果我没有将client=client()
和parallel=True
放在一起,它不会显著改变时间,因此我有点困惑。
注意:此测试在HPC设施中的交互式会话上执行:
>>> client
<Client: 'tcp://127.0.0.1:43651' processes=4 threads=4, memory=33.78 GB>
NBbis:得到的xArray是:
>>> ds
<xarray.Dataset>
Dimensions: (corner: 4, time: 363, x: 1028, x_b: 1029, y: 649, y_b: 650)
Coordinates:
lat (y, x) float64 dask.array<chunksize=(649, 1028), meta=np.ndarray>
lon (y, x) float64 dask.array<chunksize=(649, 1028), meta=np.ndarray>
* time (time) datetime64[ns] 2019-01-01T05:00:00 ... 2019-12-31T05:00:00
Dimensions without coordinates: corner, x, x_b, y, y_b
Data variables:
nitrogendioxide_tropospheric_column (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
nitrogendioxide_tropospheric_column_precision (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
qa_value (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
latitude_bounds (time, corner, y, x) float64 dask.array<chunksize=(1, 4, 649, 1028), meta=np.ndarray>
longitude_bounds (time, corner, y, x) float64 dask.array<chunksize=(1, 4, 649, 1028), meta=np.ndarray>
solar_zenith_angle (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
solar_azimuth_angle (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
viewing_zenith_angle (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
viewing_azimuth_angle (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
cloud_fraction_crb (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
surface_altitude (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
surface_albedo (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
surface_classification (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
surface_pressure (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
cloud_radiance_fraction_nitrogendioxide_window (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
nitrogendioxide_stratospheric_column (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
nitrogendioxide_stratospheric_column_precision (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
degrees_of_freedom (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
one (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
latitude_bounds_qafiltered (time, corner, y, x) float64 dask.array<chunksize=(1, 4, 649, 1028), meta=np.ndarray>
longitude_bounds_qafiltered (time, corner, y, x) float64 dask.array<chunksize=(1, 4, 649, 1028), meta=np.ndarray>
nitrogendioxide_tropospheric_column_qafiltered (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
nitrogendioxide_tropospheric_column_precision_qafiltered (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
qa_value_qafiltered (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
cloud_radiance_fraction_nitrogendioxide_window_qafiltered (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
cloud_fraction_crb_qafiltered (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
surface_altitude_qafiltered (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
surface_albedo_qafiltered (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
surface_classification_qafiltered (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
surface_pressure_qafiltered (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
solar_zenith_angle_qafiltered (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
solar_azimuth_angle_qafiltered (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
viewing_zenith_angle_qafiltered (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
viewing_azimuth_angle_qafiltered (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
nitrogendioxide_stratospheric_column_qafiltered (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
nitrogendioxide_stratospheric_column_precision_qafiltered (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
degrees_of_freedom_qafiltered (time, y, x) float64 dask.array<chunksize=(1, 649, 1028), meta=np.ndarray>
lat_b (time, y_b, x_b) float64 dask.array<chunksize=(1, 650, 1029), meta=np.ndarray>
lon_b (time, y_b, x_b) float64 dask.array<chunksize=(1, 650, 1029), meta=np.ndarray>
Attributes:
regrid_method: conservative
history: read PRODUCT group...
我查看了其他帖子,但没有找到这个问题的答案。谢谢你的帮助。
看看这个github问题——似乎有很多人对open_mfdataset的性能有问题,目前没有明显的解决方案。
使用xarray的open_mfdataset打开一系列大约90个netCDF文件,每个文件大约27MB,加载一个小的时空选择需要很长时间。 分块维度产生边际收益。decode_cf=True在函数内部或单独都没有区别。这里还有一个建议https://groups.google.com/forum/#!topic/xarray/11lDGSeza78让我将所选内容另存为一个单独的netCdf并重新
我有一个大约350个坐标的列表,这些坐标是指定区域内的坐标,我想使用Xarray从netCDF文件中提取这些坐标。如果它是相关的,我试图从一个特定的地表模型中提取SWE(雪水当量)数据。 我的问题是这个 for 循环需要永远遍历列表中的每个项目并获取相关的时间序列数据。也许在某种程度上这是不可避免的,因为我必须从每个坐标的 netCDF 文件中实际加载数据。我需要帮助的是以任何可能的方式加速代码。
我有一个包含许多方法的类,这些方法可以产生问题,所以我为这些方法实现了异常处理。现在我想在另一个类中使用这些方法。 我是否需要再次通过try和get来处理这些异常,或者我只需要调用该方法就完成了?
嗨大家好, 我的JDK版本是8u45,现在是最新的。 我想知道“最后一个例外的精确重演”在SE 8中仍然有效吗? 作为代码,如果我去掉“抛出异常”,这将是编译错误,但根据SE7的“最终异常精确重试”函数,应该可以忽略它。 另一个问题是,我们都知道如果嵌套的try框中发生了异常,我们仍然应该将其抛出到外部捕获框以避免编译错误,我最初认为我们只需要抛出任何类型的异常 但是如果我像下面的代码那样修改它:
如何处理要报告多个问题的文件上的多个异常。 我有一个多处理步骤的情况,其中不同的异常可以发生(例如,它们将在以后异步)。我使用(可能是快速失败的反模式)异常列表,然后一旦他们完成并检查异常 我有自己定制的异常类别(针对每个异步任务)(扩展类),但实现了一个接口,以包含消息特定的键值对等附加信息 示例实现 我的问题是,如果我知道我在每个任务中创建这些异常对象时会遇到什么问题,但我不会抛出它们。但如果
我有一个netCDF文件。结构: 如何提取特定经纬度(比如86.45,-156.25)和时间(比如2016-01-10)的网格单元的值?精确的纬度/经度值可能不在坐标中,在这种情况下,我们需要最接近的纬度/经度值 我可以像这样提取特定经度的值: 然而,由于-20在经度坐标中不存在,因此这不起作用。