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

Перед нами встала задача проведения эксперимента для исследования различных форматов хранения. Для этого нами были выбраны наиболее популярные форматы, которые ко всему прочему можно открыть в знакомой всем Python библиотеке Pandas (версии 1.5.1):

  • CSV – или если перевести аббревиатуру «Comma-Separated Values», как значения, разделенные запятыми. Один из наиболее популярных простых форматов и предназначен для представления табличных данных.
  • Orc – сама аббревиатура Optimized Row Columnar говорит о том, что это оптимизированный строково-столбчатый формат хранения. Был специально разработан, чтобы преодолеть ограничения других возможных форматов хранения.
  • Parquet – формат данных, который хранит вложенные структуры данных в плоском столбчатом формате. По сравнению с другими строчными подходами, более эффективен в плане хранения и производительности.

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

  1. Скорость чтения файла
  2. Скорость записи файла
  3. Занимаемый объем сохраненного файла

Исследуемые датасеты были сгенерированы с помощью библиотеки SDV. Полученные нами данные имели ровно те же свойства, которые есть у оригинального набора данных. Этот пакет генерирует объемы информации с применением математических методов и ML моделей. К слову, SDV может обрабатывать данные, если они содержат в себе несколько разных типов, а также пустые значения. Всего было сгенерировано несколько датасетов:

  • Файл размером ±1 Гб, где размерность составляет (7933070, 15)
  • Файл размером ±10 Гб, где размерность составляет (66637788, 15).

(X, Y), где X — количество строк, Y — количество столбцов.

Этого исследуемого набора хватило, чтобы провести сравнительный анализ по скорости чтения и скорости записи файлов. Ссылка на библиотеку SDV: ссылка.

Как уже было сказано ранее, для эксперимента используется Python библиотека Pandas версии 1.5.1. В этой версии есть все необходимые методы для чтения и записи файлов в необходимых для нас форматах, ниже приведена таблица с используемыми методами:

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

Весь эксперимент разбили на два этапа, где первый этап — это работа с набором данных, содержащий 8 млн строк, а второй этап уже с датасетом, содержащий 66,5 млн строк.

Суть эксперимента в каждом этапе идентична и была разделена на несколько шагов:

  1. Считывание исходного csv файла:

Например,

df = pd.read_csv('df_1gb.csv')
  1. Сохранение исходного набора данных в форматы orc и parquet, используя между сохранением перезагрузку ядра, чтобы оценить абсолютную скорость записи:

Например,

df.to_orc('df_1gb_orc.orc')
df.to_parquet('df_1gb_parquet.parquet', engine='pyarrow')

3. Считывание данных во всех форматах, используя между чтением перезагрузку ядра, чтобы аналогично как в шаге 2 оценить абсолютную скорость чтения:

df = pd.read_csv('df_1gb.csv')
df = pd.read_orc('df_1gb_orc.orc')
df = pd.read_parquet('df_1gb_parquet.parquet')
  1. Анализ полученных результатов.
  2. Формирование результатов.

Результаты:

Нами были проанализированы все полученные в ходе эксперимента результаты и собраны в итоговую таблицу, которую можно увидеть ниже:

Хочется также отметить, что все результаты проводились на компьютере MacBook Air (2020) с чипом M1 и 8 Гб ОЗУ.

В дальнейшем хотелось бы повторить эксперимент на разных по характеристикам вычислительных машинах.

Вывод:

Исходя из полученных результатов, можно сделать вывод, что формат хранения данных parquet является наиболее оптимальным вариантом для хранения больших объемов данных, так как он позволяет быстро считать данные и занимает мало места, нежели его аналоги csv и orc.

Спасибо за внимание, надеемся, что данная публикация была полезной для Вас!