- Введение
- Подготовка среды и загрузка данных
- Запуск сравнения
- Заключение и последние мысли
Прежде чем мы начнем просто слово о том, почему я это написал …
Эта первая часть не содержит никакого технического контента, вы можете перейти непосредственно к введению, если хотите.
Основная аудитория этой статьи – люди, пытающиеся обрести головы, почему и когда использовать Dask вместо панд.
Основная идея этой статьи состоит в том, чтобы заставить вас быстро и вы можете оставить с какой -то полезной информацией. Все, что вам нужно, данные и все используемые команды здесь для загрузки и запуска.
Сравнение сравнения – это Dask, сравнивая с пандами, поэтому вам нужно немного познакомиться с пандами и рамами данных, а не просто копировать вставку. Вам также нужны знания Python, особенно вокруг виртуальных сред.
Это действительно беспокоит меня, когда я читаю статьи о DASK или аналогичных технологиях, и данные недоступны. Еще более раздражает, когда сравнение основано на игрушечном примере с некоторыми фальшивыми счастливыми крошечными данными, которые вы, вероятно, никогда не увидите в реальном мире. Это моя попытка исправить это.
1. Вступление
Прежде чем мы начнем, вы должны:
- Установить Python 3.5 или старше, установленные с установленным Venv
- На данный момент система на основе Linux или немного знаний для перевода команд (У меня нет машины Windows, но выкриките мне, если вы хотите, чтобы я перевел не совместимые команды)
- Вот и все!
Главное, что нужно понять, это то, что Дуск сделан из двух частей. Динамический планировщик задач (что -то, что можно запланировать и обедать заданиями DASK для обработки данных и других вещей) и часть сбора данных. Эта вторая часть – то, что вы можете напрямую сравнить с пандами.
Вы можете думать об этом как о данных, которую вы можете разделить на разделы и запустить каждый раздел параллельно в другом месте. Вы могли бы сделать это вручную, подразделяя DataFrame Pandas и вызвать какой -то тип асинхронной функции. Даск делает это для вас из коробки.
Теперь важный бит, иногда использование Pandas – лучшая идея (лучшая производительность, более удобная и т. Д.). Одной из основных переменных, которая влияет на то, получите ли вы лучшие производительность в Pandas или Dask, является размер ваших данных. Теперь мы будем сравнивать как именно в этом аспекте.
Обратите внимание, что это сложная тема, и многие переменные будут влиять на это решение, но, надеюсь, эта статья начнет вас!
2. Подготовка среды и загрузка данных
Мы собираемся создать виртуальную среду, установить ноутбуки Pandas, Dask и Jupyter (этот последний только для запуска нашего кода).
Теперь мы создадим основную папку под названием Pandasdask
и виртуальная среда под названием Венн внутри:
mkdir pandasdask cd pandasdask python3 -m venv venv
Теперь мы активируем виртуальную среду и установим пакеты, которые нам понадобятся
source venv/bin/activate pip install "dask[complete]==2.27.0" pandas==1.1.2 jupyter==1.0.0
Когда я его устанавливал, некоторые колеса не сработали, но пакеты, тем не менее, были правильно установлены.
Прежде чем перейти к нашей ноутбуке, давайте загрузим данные, которые мы собираемся использовать. Мы будем использовать платную цену жилья в Великобритании. Убедитесь, что вы прочитали рекомендации по использованию здесь https://www.gov.uk/government/statistical-data-sets/price-paid-data-downloads#using-or-publishing-our-price-paid-data
Отказ от общения с авторским правом:
Содержит данные о земельных реестрах HM © Crown Copyright и Database Right 2020. Эти данные лицензированы в соответствии с открытой правительственной лицензией v3.0.
Мы скачаем все данные за 2019 год и все данные, когда -либо записанные. Этот второй файл составляет 3,6 ГБ на момент написания (сентябрь 2020 года), что позволит демонстрировать возможности DASK.
mkdir data cd data wget http://prod.publicdata.landregistry.gov.uk.s3-website-eu-west-1.amazonaws.com/pp-2019.csv wget http://prod.publicdata.landregistry.gov.uk.s3-website-eu-west-1.amazonaws.com/pp-complete.csv cd ..
Мы создали папку данных, вошли в нее, загрузили данные, и теперь мы вернулись в корень нашего каталога.
3. Запуск сравнения
Теперь давайте начнем ноутбук Jupyter запустить (убедитесь, что ваша виртуальная среда активирована)
jupyter notebook
Затем создайте новую записную книжку и скопируйте эти разделы в отдельные разделы.
Сначала мы импортируем необходимые библиотеки
import pandas as pd import time import dask import dask.dataframe as dd from dask.delayed import delayed import time from dask.distributed import Client, progress
Затем мы определяем наше местоположение данных и имена столбцов
one_year_data = "data/pp-2019.csv" all_data = "data/pp-complete.csv" columns = ["transaction", "price", "date", "postcode", "prop_type", "old_new", "duration", "paon", "saon", "street", "locality", "city", "district", "county", "ppd_cat", "rec_status"]
Теперь мы запускаем версию Pandas
start = time.time() df = pd.read_csv(one_year_data, header=0, names=columns) df_by_county = df.groupby("county")["price"].sum() print(df_by_county) end = time.time() print("time elapsed {}".format(end-start))
Как только это закончится, мы инициализируем работников Dask. Это если вы можете начать играть с различными конфигурациями. Я собираюсь использовать 4 работников и 4 потока, потому что это подходит моей конкретной архитектуре. Я рекомендую вам изменить эти настройки и посмотреть, что происходит, когда вы запускаете код после этого. Попробуйте сопоставить работников с вашими ядрами и изменить количество потоков, например.
client = Client(threads_per_worker=4, n_workers=4) client
Вы можете щелкнуть в ссылке, которая появляется при выполнении этой команды, чтобы взглянуть на то, как обрабатывается вещь (ссылка будет выводиться при запуске команды в пандах).
Наконец, мы запускаем версию кода DASK. Здесь я использую блокировки 32 МБ. Опять же, это то, что вы должны изменить на 16 или 64, чтобы увидеть разницу, которую она имеет.
start = time.time() df = dd.read_csv(one_year_data, blocksize=32 * 1024 * 1024, header=0, names=columns) df_by_county = df.groupby("county")["price"].sum().compute() print(df_by_county) end = time.time() print("time elapsed {}".format(end-start))
Вот результаты. Для файла one_year_data я получил:
pandas - time elapsed 2.32 seconds (rounded) dask - time elapsed 1.37 seconds (rounded)
Мы уже видим выгоду. Более того, мы должны увидеть гораздо большую выгоду от объема памяти, которую мы используем. Вы можете быстро посмотреть на это, используя такую команду, как HTOP
или монитор ресурсов. Теперь вы должны выполнять это же упражнение несколько раз с одинаковыми и разными параметрами, чтобы найти средний, а не пунктуальный результат. Я обнаружил, что мои результаты были довольно стабильными, когда это делаю.
ПРЕДУПРЕЖДЕНИЕ!!!! Следующий шаг может использовать всю память вашего компьютера и сбить ее. Убедитесь, что вы сохранили весь прогресс и имели достаточно памяти для загрузки файла 3,6 ГБ (вам понадобится около 10 ГБ для этого).
Теперь давайте запустим один и тот же код, но обрабатываем большой файл All Data. Ваш код должен выглядеть так:
start = time.time() df = pd.read_csv(all_data, header=0, names=columns) df_by_county = df.groupby("county")["price"].sum() print(df_by_county) end = time.time() print("time elapsed {}".format(end-start))
и для Дуска.
start = time.time() df = dd.read_csv(all_data, blocksize=32 * 1024 * 1024, header=0, names=columns) df_by_county = df.groupby("county")["price"].sum().compute() print(df_by_county) end = time.time() print("time elapsed {}".format(end-start))
Результаты
pandas - time elapsed 55.36 seconds (rounded) (around 10GB memory used) dask - time elapsed 19.6 seconds (rounded) (around 4.5 GB memory used)
Это большая разница, и это то, что вы ожидаете, запустив процесс параллельно.
Если на вашей машине не хватает памяти (она работает в моей, но у меня есть 32 ГБ оперативной памяти), попробуйте использовать меньший файл, разделив файл, используя следующую команду. Эта команда будет делиться примерно по 4 секциям каждая из максимум 7000 строк
split -l 7000000 data/pp-complete.csv data/half_data.csv
4. Заключение и последние мысли
Мы увидели значительные успехи в более крупном файле с помощью DASK. Панды можно сделать более эффективным и также запустить «куски», но главной идеей было проиллюстрировать поведение «ванили». Вы можете прочитать больше об этом здесь:
https://stackoverflow.com/questions/25962114/how-do-i-read-a-large-csv-file-with-pandas
Важно помнить, что это очень сложная тема, и есть много факторов, чтобы рассмотреть, прежде чем сделать вывод, что Dask решит все ваши проблемы. Это другая более сложная настройка, которая может потребовать дополнительного мониторинга, например.
Кроме того, он будет сильно зависеть от размера вашего файла (пандам следует победить DASK в файле около 10 МБ и меньше) и вашей архитектуры. Например, одной интересной вещью является то, что ваш компьютер запустит что-то тяжелое, например, Slack или спам-страницу (здесь будет идеальным таблоидом) и повторно запустите упражнение. Вы увидите, что если вы уже вынимаете пару ядер с другими процессами, разница между Pandas и DASK может сократиться в относительном выражении (будучи пандами одним основным процессом). Даже в некоторых случаях я видел, как панды работают быстрее, чем Dask в меньшем файле.
Я надеюсь, что вам понравились эти маленькие руки на упражнениях, и теперь вы находитесь в лучшем месте, чтобы вырвать дальнейшие знания.
Оригинал: “https://dev.to/zompro/quick-pandas-and-dask-comparison-processing-large-csv-files-real-world-example-that-you-can-do-now-1n15”