PythonH5py-对不规则数组的高效访问

PythonH5py-对不规则数组的高效访问,python,numpy,memory,h5py,ragged,Python,Numpy,Memory,H5py,Ragged,我有一个很大的h5py文件,在一个大数据集中有几个不规则的数组。阵列具有以下类型之一: # Create types of lists of variable length vectors vardoub = h5py.special_dtype(vlen=np.dtype('double')) varint = h5py.special_dtype(vlen=np.dtype('int8')) 在一个HDF5组(grp)中,我创建了N个交错项的数据集,例如: d = grp.create_d

我有一个很大的h5py文件,在一个大数据集中有几个不规则的数组。阵列具有以下类型之一:

# Create types of lists of variable length vectors
vardoub = h5py.special_dtype(vlen=np.dtype('double'))
varint = h5py.special_dtype(vlen=np.dtype('int8'))
在一个HDF5组(grp)中,我创建了N个交错项的数据集,例如:

d = grp.create_dataset("predictions", (N,), dtype=vardoub)
并使用长numpy数组(通常为数亿)填充d[0]、d[1]、…、d[N-1]

创建这些阵列效果很好,我的问题与访问有关。如果我想访问其中一个阵列中的一个片,例如d[0][5000:6000]或d[0][50、89、100],内存使用率会非常高,我相信它会在阵列的大部分区域读取;我可以看到物理内存使用率从5-6GB迅速上升到32GB(机器上的RAM大小)。p=d[0]将整个数组读取到内存中,因此我认为这正在发生,然后它正在索引到内存中

有更好的方法吗?d[n]的类型是一个numpy数组,我不能引用它。我怀疑我可以重新构造数据,以便为每个索引(例如“0/预测”、“1/预测”)设置组,但如果有合理的替代方案,我宁愿不必转换这些数据

谢谢,,
玛丽

是的,我认为你是对的
d[0]
加载整个数组,并在
ndarray
上执行以下切片。我没有太多地使用
vlen
dtypes,但我怀疑
h5py
(或HDF5)在这些对象中实现索引或切片。如果
N
不是太大,那么将它们放入自己的数据集中可能会更有效。您可以查看
type(d[0])
来验证这一点。如果我加载一个示例
arr=d[:]
,我会得到一个对象数据类型数组,每个元素都是
ndarray
。感谢hpaulj,这正是我看到的。我将对此进行讨论,但我认为我可能需要从粗糙的数组转移到上面提到的0/predictions模型。感谢你的反馈-是的,我认为你是对的
d[0]
加载整个数组,并在
ndarray
上执行以下切片。我没有太多地使用
vlen
dtypes,但我怀疑
h5py
(或HDF5)在这些对象中实现索引或切片。如果
N
不是太大,那么将它们放入自己的数据集中可能会更有效。您可以查看
type(d[0])
来验证这一点。如果我加载一个示例
arr=d[:]
,我会得到一个对象数据类型数组,每个元素都是
ndarray
。感谢hpaulj,这正是我看到的。我将对此进行讨论,但我认为我可能需要从粗糙的数组转移到上面提到的0/predictions模型。感谢您的反馈-玛丽