Ответ 1
Как уже говорилось выше, теоретическая причина, по которой .to_parquet()
не должна справляться с вашими данными, не существует. Однако количество столбцов чрезвычайно велико, и из-за наличия связанных с ними накладных расходов неудивительно, что процесс занимает много времени - это не типичный вариант использования.
Похоже, ваши данные лучше всего воспринимать как массив, а не таблицу. Существуют механизмы хранения массивов, которые позволяют вам размещать в каждом измерении, например zarr, что также позволяет выполнять различные операции сжатия и предварительной фильтрации которые могут эффективно использовать дисковое пространство. (Другие форматы, такие как HDF5, также популярны для такой задачи)
Пример того, как хранить массив 10k X 10k:
import dask.array as da
import zarr
arr = da.random.random(size=(10000, 10000), chunks=(1000, 1000))
z = zarr.open_array('z.zarr', shape=(10000, 10000), chunks=(1000, 1000), mode='w', dtype='float64')
arr.store(z)
а теперь z.zarr/содержит 100 блоков данных.
В вашем случае сложная часть считывает данные, поскольку вы не знаете априорно количество строк. Вы можете использовать
df = dataframe.read_csv(..)
len(df) # get length
z = zarr.open_arr(...) # provide dtype, size and chunk appropriately
df.values.store(z)
или более эффективно обернуть np.loadtxt
с помощью dask.delayed
, чтобы отказаться от этапа кадра данных.