Dask читать CSV против панд читать CSV - PullRequest
0 голосов
/ 22 февраля 2019

У меня следующая проблема.У меня огромный CSV-файл, и я хочу загрузить его с помощью многопроцессорной обработки.Pandas требуется 19 секунд для файла примера с 500000 строками и 130 столбцами с разными dtypes.Я попробовал dask, потому что я хочу многопроцессорность чтения.Но это длится намного дольше, и мне интересно, почему.У меня 32 ядра.и попробовал это:

import dask.dataframe as dd
import dask.multiprocessing
dask.config.set(scheduler='processes')
df = dd.read_csv(filepath,  
             sep='\t',
            blocksize=1000000,
             )
df = df.compute(scheduler='processes')     # convert to pandas

Ответы [ 4 ]

0 голосов
/ 23 февраля 2019

Я рекомендую использовать для вычисления различное количество процессов с аргументом ключевого слова num_workers.

Вопреки сказанному выше, read_csv определенно привязан к вычислениям, и, вероятно, несколько параллельных процессов будут работать параллельноhelp.

Тем не менее, слишком большое количество процессов, которые все забивают на диск одновременно, могут вызвать много споров и замедлить процесс.

Я рекомендую немного поэкспериментировать с различным числом процессов.чтобы увидеть, что работает лучше всего.

0 голосов
/ 22 февраля 2019

При чтении огромного файла с диска узким местом является IO.Так как Pandas высоко оптимизирован с C-парсером, выигрыша очень мало.Любая попытка использовать многопроцессорность или многопоточность, вероятно, будет менее производительной, поскольку вы потратите то же время на загрузку данных с диска и добавите только некоторые накладные расходы для синхронизации различных процессов или потоков.

0 голосов
/ 22 февраля 2019

Рассмотрим, что это означает:

df = df.compute (scheduler = 'процессы')

  • каждый процесс обращается к некоторому фрагменту исходных данных,Это может быть параллельно или, весьма вероятно, ограничено вводом-выводом базового запоминающего устройства
  • , каждый процесс создает кадр данных из своих данных, который перегружен ЦП и будет хорошо распараллеливаться
  • каждыйЧанк сериализуется процессом и передается клиенту, откуда вы его назвали
  • клиент десериализует чанки и объединяет их для вас.

Краткая история: не используйте Daskесли ваша единственная задача - получить фрейм данных Pandas в памяти, это только увеличивает накладные расходы. Делайте используйте Dask, если вы можете работать с чанками независимо, и собирать только небольшие выходные данные в клиенте (например, groupby-aggregate и т. Д.).

0 голосов
/ 22 февраля 2019

Вы можете использовать mutliprocessthing, но, так как файл не обрезан, вы рискуете ждать, когда программа / поток захочет получить доступ к файлу (это имеет место после вашей проверки).

Если вы хотите использоватьправильно, многопроцессорная обработка, я рекомендую вам разрезать файл по разным частям и объединить все результаты в конечную операцию

...