Ответ 1
Да, dask.dataframe может читать параллельно. Однако вы столкнулись с двумя проблемами:
Pandas.read_csv только частично освобождает GIL
По умолчанию dask.dataframe распараллеливается с потоками, потому что большинство панд может работать параллельно в нескольких потоках (освобождает GIL). Pandas.read_csv является исключением, особенно если ваши результирующие кадры данных используют dtypes объекта для текста
dask.dataframe.to_hdf (имя файла) форсирует последовательные вычисления
Запись в один файл HDF приведет к последовательным вычислениям (очень трудно писать в один файл параллельно).
Изменение: новое решение
Сегодня я бы избегал HDF и использовал вместо этого паркет. Я бы, вероятно, использовал многопроцессорные или dask.distributed планировщики, чтобы избежать проблем GIL на одной машине. Сочетание этих двух должно дать вам полное линейное масштабирование.
from dask.distributed import Client
client = Client()
df = dask.dataframe.read_csv(...)
df.to_parquet(...)
Решение
Поскольку ваш набор данных, вероятно, помещается в памяти, используйте dask.dataframe.read_csv для загрузки параллельно с несколькими процессами, а затем немедленно переключитесь на Pandas.
import dask.dataframe as ddf
import dask.multiprocessing
df = ddf.read_csv("data/Measurements*.csv", # read in parallel
sep=';',
parse_dates=["DATETIME"],
blocksize=1000000,
)
df = df.compute(get=dask.multiprocessing.get) # convert to pandas
df['Type'] = df['Type'].astype('category')
df['Condition'] = df['Condition'].astype('category')
df.to_hdf('data/data.hdf', 'Measurements', format='table', mode='w')