Эффективно читать большой CSV-файл по частям, используя Dask - PullRequest
0 голосов
/ 18 марта 2020

Теперь я читаю большой CSV-файл, используя Dask, и выполняю некоторую постобработку (например, делаю математические вычисления, затем прогнозирую их с помощью модели ML и записываю результаты в базу данных). Избегая загрузки всех данных в память, я хочу читать по частям текущего размера: прочитать первый кусок, предсказать, записать, прочитать второй кусок и т. Д. c.

Я попробовал следующее решение, используя skiprows и nrows:

import dask.dataframe as dd
read_path = "medium.csv"

# Read by chunk
skiprows = 100000
nrows = 50000
res_df = dd.read_csv(read_path, skiprows=skiprows)
res_df = res_df.head(nrows)

print(res_df.shape)
print(res_df.head())

Но я получаю ошибку:

ValueError: Образец недостаточно велик, чтобы включить хотя бы одну строку данных. Пожалуйста, увеличьте число байтов в sample в вызове до read_csv / read_table

Также, как я понимаю, он будет вычислять двоичную маску каждый раз ([False, False, .. ., True, ...]) для всех данных, чтобы найти строки для загрузки. Как мы можем сделать это более эффективным? Может быть, использовать некоторые распределенные или отложенные функции из dask?

1 Ответ

0 голосов
/ 28 марта 2020

Dask dataframe разделит данные для вас, вам не нужно использовать nrows/skip_rows

df = dd.read_csv(filename)

Если вы хотите выбрать определенный раздел, вы можете использовать средство доступа к разделам

part = df.partitions[i]

Однако вы также можете применять свои функции параллельно.

df.map_partitions(process).to_csv("data.*.csv")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...