Время прочтения: 3 мин.

Разработанная для обработки больших объёмов данных, без загрузки их в оперативную память, библиотека vaex позволяет работать с датасетами, размер которых достигает 1 терабайта или 1 миллиарда строк. Благодаря этому, возможно работать с данными, обработка которых с помощью стандартных средств Рandas будет выполняться долго или в принципе невозможна. Библиотека vaex дублирует многие функции, доступные в Python, поэтому её использование не требует особых дополнительных знаний, если пользователь знаком с библиотекой Python.

Для начала инициализируем наш датасет. В качестве датасета используется сгенерированный набор данных размером 20 000 000 строк, 1.6 гб. Данные выглядят следующим образом:

Первым шагом требуется переформатировать данные из текстового формата в бинарный формат hdf5, штатный для использования в vaex. Для этого выполним функцию vaex.from_csv с параметром convert:

vx = vaex.from_csv(r"C:\Users\Milovanov-MV\big_data.csv",convert =True, chunk_size = 5_000_000, sep = ';')

Параметр chunk_size предназначен для разграничения загрузки на блоки, в данном случае по 5 000 000 строк. Это позволяет загружать датасеты, которые иначе не помещаются в оперативную память. Подготовка нашего датасета заняла порядка 60 секунд. Последующая инициализация файла занимает порядка 2.5 секунд, против 18 секунд для датафрейма pandas.

Теперь, когда мы инициализировали датафрейм можно провести несколько сравнительных операций и наглядно увидеть, как работает алгоритм. Для начала просто выполним команду describe:

description = vx.describe()

Время на формирование описания для обоих библиотек было примерно одинаковое и составило 2.5 секунд. На больших датасетах оно может отличатся в пользу vaex, но уже это наглядно демонстрирует, что скорость работы не снижается. Теперь сравним работу алгоритма группировки, на примере данной команды:

group = vx.groupby('names', agg = vaex.agg.mean('0'))
print(group)

В данном случае мы сформировали группировку по столбцу «names», которая заняла у нас менее одной секунды. Для сравнения, такая же группировка для датафрейма pandas занимает порядка 1.5 секунд.

Применим к данным простую обработку: с помощью функции apply модифицируем данные в одном из столбцов. 

group = vx.apply(lambda x: x.replace('a', 'aaa'), ['names'])

Так как vaex использует ленивое выполнение запросов, данный код выполняется практически моментально и не занимает места в памяти. Последующее использование полученных данных так же не занимает много времени. Например, выполнение данного кода

vx['new_col'] = vx.apply(lambda x: x.replace('a', 'aaa'), ['names'])
vx2 = vx[vx.new_col.str.contains('aaa')]
vx2.describe()

занимает порядка 20 секунд.

А теперь, такими же примерами рассмотрим пример работы с данными, которые занимают гораздо больше места в памяти. Возьмём датасет размером в 100 000 000 строк, который занимает на диске почти 4 гб. Его инициализация занимает 3 секунды, построение описания – 13 секунд, а группировка – 4.5 секунды. При этом, весь процесс занимает в оперативной памяти не более 1 гб. Фильтрация с последующей группировкой занимает в памяти всего 2 гб и выполняется 5 минут. Основным преимуществом в данном случае является экономное использование оперативной памяти, позволяющее работать с данными огромных размеров. Для сравнения, только загрузка данного датасета занимает 8 гб в pandas, построение статистики занимает 16 секунд и требует использования файла подкачки, группировка – 10 секунд, а фильтрацию невозможно выполнить из-за переполнения оперативной памяти. Именно на таких датасетах и проявляются основные преимущества данного пакета.

Очевидно, что далеко не всегда приходится работать с данными подобных размерностей. Однако, когда такая необходимость возникает, способность выполнять быстрые вычисления без загрузки всего датасета в оперативную память предоставляет возможность выполнять подготовку и обработку данных, с которыми иначе работать попросту невозможно.