I discovered today that Astropy's FITS reader can't handle decompressing individual tiles inside a compressed HDU. This means that when people use the user tools, for any read operation on a file the whole file has to be loaded into memory and decompressed. This is memory and time inefficient. See: astropy/astropy#3895 for more details on the lack of support from Astropy.
An alternative (that I left the door open for) is to use a different FITS library to load the data inside our Dask arrays. The best candidate for this would be the fitsio package, some quick benchmarks indicate that fitsio handles decompressing individual tiles and even decompresses the whole image faster than astropy:
In [44]: %timeit fits.getdata("VBI_L1_00656282_2018_05_11T14_25_05_466665_I.fits", hdu=1)
183 ms ± 248 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [45]: %timeit hdu[1][:, :]
131 ms ± 182 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [46]: %timeit f.read("VBI_L1_00656282_2018_05_11T14_25_05_466665_I.fits")
131 ms ± 196 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [48]: %timeit hdu[1][0, 0]
21.6 µs ± 191 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
In [49]: %timeit hdu[1][0, :]
22.3 µs ± 78.2 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
In [50]: %timeit hdu[1][:10, :]
235 µs ± 718 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
I think a good approach would be to be able to optionally use fitsio if it is already installed. This way we aren't mandating it's import so we probably could argue the corner with the licencing issues, and also we aren't requiring people to compile it. Making it optional like this would require hooking in some configuration options because the point where the loader is decided is inside the asdf converter, where we can't pass user arguments though.