Когда пришло время обрабатывать много данных - так много, что вы находитесь в сфере больших данных - какие инструменты вы можете использовать для обработки данных, особенно в среде ноутбука? Pandas не очень хорошо справляется с большими данными, в отличие от двух других библиотек. Итак, какой из них лучше и быстрее?
Недавно я написал две вводные статьи об обработке больших данных с помощью Dask и Vaex - библиотек для обработки больших, чем наборы данных памяти. Пока писал, у меня в голове возник вопрос:
Могут ли эти библиотеки действительно обрабатывать данные, превышающие объемы памяти, или это всего лишь рекламный слоган?
Это заинтриговало меня провести практический эксперимент с Dask и Vaex и попытаться обработать набор данных, превышающий объем памяти. Набор данных был настолько большим, что вы даже не можете открыть его с помощью pandas.
Что я имею в виду под большими данными?
Большие данные - это нечетко определенный термин, у которого столько же определений, сколько обращений в Google. В этой статье я использую этот термин для описания набора данных, который настолько велик, что для его обработки требуется специальное программное обеспечение. Под Big я имею в виду «больше, чем основная память на одной машине».
Определение из Википедии:
Большие данные - это область, в которой рассматриваются способы анализа, систематического извлечения информации или иной работы с наборами данных, которые слишком велики или сложны для обработки традиционным прикладным программным обеспечением для обработки данных.
Что такое Dask и Vaex ?
Dask обеспечивает расширенный параллелизм для аналитики, обеспечивая масштабируемую производительность для ваших любимых инструментов. Сюда входят numpy, pandas и sklearn. Это открытый исходный код и бесплатный доступ. Он использует существующие API-интерфейсы Python и структуры данных, чтобы упростить переключение между эквивалентами на базе Dask.
Vaex - это высокопроизводительная библиотека Python для ленивых фреймов данных вне ядра (похожих на Pandas) для визуализации и изучения больших наборов табличных данных. Он может вычислять базовую статистику для более чем миллиарда строк в секунду. Он поддерживает несколько визуализаций, позволяющих интерактивно исследовать большие данные.
Dask и Vaex Dataframes не полностью совместимы с Pandas Dataframes, но некоторые наиболее распространенные операции «обработки данных» поддерживаются обоими инструментами. Dask больше ориентирован на масштабирование кода для вычисления кластеров, в то время как Vaex упрощает работу с большими наборами данных на одной машине.
Эксперимент
Я создал два файла CSV с 1 миллионом строк и 1000 столбцов. Размер файла составлял 18,18 ГБ, что в совокупности составляет 36,36 ГБ. Файлы имеют случайные числа из равномерного распределения от 0 до 100.
Эксперимент проводился на MacBook Pro с 32 ГБ оперативной памяти - настоящий зверь. При тестировании пределов фрейма данных pandas я неожиданно обнаружил, что достижение ошибки памяти на такой машине является довольно сложной задачей!
macOS начинает выгружать данные из основной памяти на твердотельный накопитель, когда память работает почти на полную мощность. Верхний предел для pandas Dataframe составлял 100 ГБ свободного дискового пространства на машине.
Когда вашему Mac требуется память, он помещает то, что в данный момент не используется, в файл подкачки для временного хранения. Когда ему снова потребуется доступ, он прочитает данные из файла подкачки и обратно в память.
Я потратил некоторое время на размышления о том, как мне решить эту проблему, чтобы эксперимент был честным. Первая идея, которая пришла мне в голову, заключалась в том, чтобы отключить подкачку, чтобы в каждой библиотеке была доступна только основная память - удачи в этом на macOS. Проведя несколько часов, я не смог отключить подкачку.
Вторая идея заключалась в использовании подхода грубой силы. Я заполнил твердотельный накопитель на полную мощность, чтобы операционная система не могла использовать подкачку, так как на устройстве не осталось свободного места.
Это сработало! pandas не смог прочитать два файла размером 18 ГБ, и ядро Jupyter разбилось.
Если бы я снова провел этот эксперимент, я бы создал виртуальную машину с меньшим объемом памяти. Таким образом, было бы легче показать пределы возможностей этих инструментов.
Могут ли Dask или Vaex помочь нам в обработке этих больших файлов? Какой из них быстрее? Давай выясним.
Vaex против Dask
При разработке эксперимента я думал об основных операциях при выполнении анализа данных, таких как группировка, фильтрация и визуализация данных. Придумал следующие операции:
- расчет 10-го квантиля столбца,
- добавление нового столбца,
- фильтрация по столбцу,
- группировка по столбцу и агрегирование,
- визуализация столбца.
Все вышеперечисленные операции выполняют вычисления с использованием одного столбца, например:
Поэтому я был заинтригован попыткой выполнить операцию, которая требует обработки всех данных:
- вычислить сумму всех столбцов.
Этого можно добиться, разбив расчет на более мелкие части. Например, чтение каждого столбца отдельно и вычисление суммы, а на последнем этапе вычисление общей суммы. Эти типы вычислительных задач известны как неловко параллельные - не требуется усилий, чтобы разделить проблему на отдельные задачи.
Vaex
Начнем с Vaex. Эксперимент был разработан в соответствии с лучшими практиками для каждого инструмента - это использование двоичного формата HDF5 для Vaex. Поэтому нам нужно преобразовать файлы CSV в формат HDF5 (формат иерархических данных версии 5).
Vaex потребовалось 405 секунд, чтобы преобразовать два файла CSV (36,36 ГБ) в два файла HDF5, которые вместе составляют 16 ГБ. Преобразование текста в двоичный формат уменьшило размер файла.
Откройте набор данных HDF5 с помощью Vaex:
Vaex потребовалось 1218 секунд для чтения файлов HDF5. Я ожидал, что это будет быстрее, поскольку Vaex утверждает, что файлы в двоичном формате открываются практически мгновенно.
Из документации Vaex:
Открытие таких данных происходит мгновенно, независимо от размера файла на диске: Vaex просто отображает данные в памяти, а не читает их в памяти. Это оптимальный способ работы с большими наборами данных, размер которых превышает доступную оперативную память.
Показать голову с Vaex:
Vaex потребовалось 1189 секунд, чтобы отобразить голову. Я не уверен, почему отображение первых 5 строк каждого столбца заняло так много времени.
Рассчитайте 10-й квантиль с помощью Vaex:
Обратите внимание, что у Vaex есть функция percentile_approx, которая вычисляет аппроксимацию квантиля.
Vaex потребовалось 0 секунд, чтобы вычислить приближение 10-го квантиля для столбца col1.
Добавьте новый столбец с Vaex:
В Vaex есть концепция виртуальных столбцов, в которых выражение хранится в виде столбца. Он не занимает никакой памяти и вычисляется на лету, когда это необходимо. Виртуальный столбец обрабатывается так же, как обычный столбец. Как и ожидалось, Vaex потребовалось 0 секунд для выполнения приведенной выше команды.
Отфильтруйте данные с помощью Vaex:
У Vaex есть концепция выбора, которую я не использовал, поскольку Dask не поддерживает выбор, что сделало бы эксперимент несправедливым. Фильтр ниже похож на фильтрацию с пандами, за исключением того, что Vaex не копирует данные.
Vaex потребовалось 0 секунд для выполнения указанного выше фильтра.
Группировка и агрегирование данных с Vaex:
Приведенная ниже команда немного отличается от pandas, поскольку сочетает в себе группировку и агрегацию. Команда группирует данные по col1_binary и вычисляет среднее значение для col3:
Vaex потребовалось 0 секунд для выполнения приведенной выше команды.
Визуализируйте гистограмму:
Визуализация с большими наборами данных проблематична, поскольку традиционные инструменты анализа данных не оптимизированы для их обработки. Давайте попробуем построить гистограмму col3 с помощью Vaex.
Vaex потребовалось 0 секунд, чтобы отобразить график, что было на удивление быстро.
Подсчитайте сумму всех столбцов
Память не является проблемой при обработке одного столбца за раз. Давайте попробуем вычислить сумму всех чисел в наборе данных с помощью Vaex.
Vaex потребовалось 40 секунд, чтобы вычислить сумму всех столбцов.
Dask
Теперь давайте повторим описанные выше операции, но с Dask. Ядро Jupyter было перезапущено перед запуском команд Dask.
Вместо того, чтобы читать CSV-файлы напрямую с помощью функции Dask read_csv, мы конвертируем CSV-файлы в HDF5, чтобы эксперимент был честным.
Dask потребовалось 763 секунды для конвертации. Сообщите мне в комментариях, есть ли более быстрый способ конвертировать данные с помощью Dask. Я безуспешно пытался прочитать файлы HDF5, конвертированные с помощью Vaex.
Лучшие практики с Dask:
HDF5 - популярный выбор для пользователей Pandas, которым требуется высокая производительность. Мы рекомендуем пользователям Dask DataFrame вместо этого хранить и загружать данные с помощью Parquet.
Откройте набор данных HDF5 с помощью Dask:
Даску потребовалось 0 секунд, чтобы открыть файл HDF5. Это потому, что я явно не запускал команду compute, которая фактически считывала бы файл.
Показать голову с Dask:
Dask потребовалось 9 секунд, чтобы вывести первые 5 строк файла.
Рассчитайте 10-й квантиль с помощью Dask :
В Dask есть функция квантиля, которая вычисляет фактический квантиль, а не приближение.
Dask не удалось вычислить квантиль из-за сбоя ядра Juptyter.
Определите новый столбец с помощью Dask:
В приведенной ниже функции для определения нового двоичного столбца используется функция квантиля. Dask не удалось его вычислить, потому что он использует квантиль.
Отфильтруйте данные с помощью Dask:
Для выполнения приведенной выше команды требуется 0 секунд, поскольку Dask использует парадигму отложенного выполнения.
Группировка и агрегирование данных с помощью Dask:
Dask не удалось сгруппировать и агрегировать данные.
Визуализируйте гистограмму col3:
Dask не удалось визуализировать данные.
Подсчитайте сумму всех столбцов:
Dask не удалось суммировать все данные.
Полученные результаты
В таблице ниже показано время выполнения эксперимента Вэйкс против Даска. NA означает, что инструмент не смог обработать данные, и ядро Jupyter потерпело крах.
Заключение
Vaex требует преобразования CSV в формат HDF5, что меня не беспокоит, так как вы можете пойти на обед, вернуться, и данные будут преобразованы. Я также понимаю, что в суровых условиях (например, в эксперименте) при небольшом количестве или отсутствии данных в основной памяти чтение займет больше времени.
Я не понимаю, сколько времени понадобилось Vaex для отображения заголовка файла (1189 секунд для первых 5 строк!). Другие операции в Vaex сильно оптимизированы, что позволяет нам проводить интерактивный анализ данных на наборах данных, больших, чем основная память.
Я как бы ожидал проблем с Dask, поскольку он больше оптимизирован для вычислительных кластеров, а не для одной машины. Dask построен на основе pandas, что означает, что операции, которые выполняются медленно в pandas, остаются медленными в Dask.
Победитель эксперимента очевиден. Vaex мог обрабатывать файл большего размера, чем основной файл памяти на ноутбуке, в то время как Dask не мог. Этот эксперимент специфичен, поскольку я тестирую производительность на одной машине, а не на вычислительном кластере.
Оригинал https://towardsdatascience.com/are-you-still-using-pandas-to-process-big-data-in-2021-850ab26ad919. Размещено с разрешения.