Closed mikejiang closed 2 years ago
Hi @jreadey, we're interested in using fancy indexing with HSDS datasets as well. Initially, we tried using the equivalent point selection as suggested in #48 as a workaround, but are finding that the performance is poor relative to a hyperslab selection on a superset of the point selection once you get past the scale of 10k points.
Just curious to see if there's any update on what it would take to implement fancy indexing at this point. I was looking through the RESTful HDF5 white paper and noticed that there is a section under the Dataset POST spec that mentions "set-theoretical combinations of hyperslabs" but a detailed example request is not given. It's also not mentioned in the h5serv documentation so I'm wondering if it made it into the final version of the spec.
Yes, I've been meaning to get to this... I think a fairly simple extension to the dataset GET api should work (basically passing in the h5py index as parameters). They h5py docs have a warning that performance could be sub-optimal, but I'd want o make a related HSDS update to do the fancy selection efficiently.
You are looking to handle this type of idexing:
dset[4:6, [2,5,9]]
correct?
Also, I see that h5py recently added support for Multi-Block selection: https://docs.h5py.org/en/stable/high/dataset.html#multi-block-selection. Is that of interest as well/
That's right. We don't have a specific need for multi-block selection at the moment, just fancy indexing as you've described.
To clarify, is it be possible to make a fancy indexing request (albeit less efficiently) via the dataset value GET API currently? Wondering if we could test this out with a modification of the h5pyd client or if an HSDS update would be required.
Yes, you can just do multiple regular selections. E.g., instead of dset[4:6, [2,5,9]], do the following:
arr = np.zeros((2,3))
for i in (2,5,9):
arr[:,i] = dset[4:6,i]
It's unfortunate that h5pyd doesn't support asynchronous requests which would let you do all the fetches without waiting for responses, but this should work till we have the fancy selection going.
I believe I have this feature working now. Code changes are in the fancyindx branch of hsds and fancyindx branch of h5pyd. I'll be doing some additional testing and evaluation and then merge into master later this week.
The feature is merged into master now and in PyPI (version 0.9.2).
Here's a simple performance test comparing using fancy indexing vs iterating through a set of columns: https://gist.github.com/jreadey/bd75c469559f03596bd2d274dfb5a315. In my testing using fancy indexing was ~8x faster (running with 4 HSDS nodes).
@jreadey , I think you were aware of it since you mentioned Coordinate list (
dset[(x,y,z),:]
) not being supported yet (not sure if you actually meantlist
). But I considered it as the one of most used selection type that is worth the efforts to be added.