Почему Dask использует только одно ядро?
Часть JSON-разбора, вероятно, связана с GIL, вы хотите использовать процессы. Однако когда вы, наконец, что-то вычисляете, вы используете фреймы данных, которые обычно предполагают, что вычисления высвобождают GIL (это часто встречается в Pandas), поэтому он использует потоковый бэкэнд по умолчанию. Если вы в основном связаны с этапом синтаксического анализа GIL, то, возможно, вы захотите использовать многопроцессорный планировщик. Это должно решить вашу проблему:
dask.config.set(scheduler='multiprocessing')
Как избежать использования памяти во время фазы set_index
Да, для вычисления set_index требуется полный набор данных. Это сложная проблема. Если вы используете планировщик с одним компьютером (как вы, похоже, делаете), то для этого процесса сортировки необходимо использовать внешнюю структуру данных. Я удивлен, что у него заканчивается память.
Как оценить минимально необходимый объем памяти без проб и ошибок?
К сожалению, сложно оценить размер JSON-подобных данных в памяти на любом языке. Это гораздо проще с плоскими схемами.
Есть ли лучший подход?
Это не решит вашу основную проблему, но вы можете рассмотреть возможность размещения данных в формате Parquet перед тем, как попытается отсортировать все. Затем попробуйте сделать dd.read_parquet(...).set_index(...).to_parquet(...)
в изоляции. Это может помочь выделить некоторые расходы.