Ну, в настоящее время вы все еще загружаете все данные в массивный массив, так что он должен уместиться в памяти?
В идеале вы должны использовать технологию хранения, которая допускает редкое хранение или, по крайней мере, произвольный доступ. TileDB сегодня интересный выбор.
Сегодня я, вероятно, хотел бы хранить данные в HDF5 или Zarr с некоторым подходящим сжатием, чтобы скрыть стоимость нулей, а затем вызвать
x = da.from_array(storage, chunks='auto')
x = x.map_partitions(sparse.COO)
Точно так же, как у вас выше, но где хранилище - это то, что обеспечивает произвольный доступ с диска.