2

我目前正在尝试将一个大的多维数组(> 5 GB)加载到 python 脚本中。由于我将数组用作机器学习模型的训练数据,因此以小批量有效加载数据但避免将整个数据集加载到内存中一次非常重要。
我的想法是使用xarray库。我用X=xarray.open_dataset("Test_file.nc"). 据我所知,此命令不会将数据集加载到内存中——到目前为止,一切都很好。但是,我想X使用命令转换为数组X=X.to_array()

我的第一个问题是:是否X=X.to_array()将其加载到内存中?

如果这样做了,我想知道如何最好地将小批量加载到内存中。数组的形状是 (variable,datetime,x1_position,x2_position)。我想在每个日期时间加载小批量,这将导致:

ind=np.random.randint(low=0,high=n_times,size=(BATCH_SIZE))
mini_batch=X[:,ind]

另一种方法是在使用之前转置数组X.transpose("datetime","variable","x1_position","x2_position"),然后通过以下方式进行采样:

ind=np.random.randint(low=0,high=n_times,size=(BATCH_SIZE))
mini_batch=X[ind,:]

我的第二个问题是: 转置 xarray 会影响索引效率吗?更具体地说,是否X[ind,:]需要只要X[:,ind]

4

1 回答 1

0

我的第一个问题是: X=X.to_array() 是否将其加载到内存中?

xarray利用将dask部分数据分块(加载)到内存中。您可以通过比较 X

X = xarray.open_dataset("Test_file.nc")
# or
X = xarray.open_dataset("Test_file.nc",
         chunks={'datetime':1, 'x1_position':x1_count, 'x2_position':x2_count})

并查看 ( print(X)) 加载数据集之间的差异,或相应地指定块。

后一种方式意味着只将一个切片数据分块(加载)datetime到内存中。我认为您不需要X=X.to_array(),但您也可以在to_array(). 我的经验是,to_array()这不会改变实际的分块(加载),而只会改变数据的视图。

我的第二个问题是:转置 xarray 会影响索引效率吗?更具体地说,X[ind,:] 是否与 X[:,ind] 一样长?

我认为的一个目标xarray是让用户忘记底层实现的细节(基于numpy)。转置只能修改视图而不是数据的底层结构。两种索引方式之间肯定存在一些效率差异,具体取决于哪一种方式沿着连续内存访问数据。但这种差异不会是开销。随意使用两者。

于 2020-08-21T03:19:07.760 回答