Как оценить, сколько памяти понадобится DataFrame от Pandas?

Мне было интересно ... Если я читаю, скажем, 400-мегабайтный CSV-файл в фрейм данных pandas (используя read_csv или read_table), есть ли способ угадать, сколько памяти потребуется? Просто пытаюсь лучше понять кадры данных и память ...

70 голосов | спросил Anne 7 AM000000120000005531 2013, 00:18:55

7 ответов


0

df.memory_usage() вернет, сколько занимает каждый столбец:

>>> df.memory_usage()

Row_ID            20906600
Household_ID      20906600
Vehicle           20906600
Calendar_Year     20906600
Model_Year        20906600
...

Чтобы включить индексы, передайте index=True.

Итак, чтобы получить общее потребление памяти:

>>> df.memory_usage(index=True).sum()
731731000

Кроме того, передача memory_usage = 'deep' включит более точный отчет об использовании памяти, который учитывает полное использование содержащихся объектов.

Это связано с тем, что использование памяти не включает память, потребляемую элементами, которые не являются компонентами массива, если deep = False (по умолчанию).

ответил Aleksey Sivokon 6 +03002015-10-06T15:34:11+03:00312015bEurope/MoscowTue, 06 Oct 2015 15:34:11 +0300 2015, 15:34:11
0

Вот сравнение различных методов - sys.getsizeof(df) является самым простым.

В этом примере df - это кадр данных с 814 строками, 11 столбцами (2 дюйма, 9 объектов) - считанный из 427 КБ. шейпфайл

sys.getsizeof (DF)

> > > импорт системы
> > > sys.getsizeof (DF)
(дает результаты в байтах)
462456

df.memory_usage ()

> > > df.memory_usage ()
...
(перечисляет каждый столбец по 8 байт /строка)

> > > df.memory_usage (). сумма ()
71712
(примерно строки * столбцы * 8 байт)

> > > df.memory_usage (глубокая = True)
(перечисляет полное использование памяти каждого столбца)

> > > df.memory_usage (глубокая = True) .sum ()
(дает результаты в байтах)
462432

df.info ()

Печатает информацию о кадре в стандартный вывод. Технически это кибибайты (KiB), а не килобайты - как говорит строка документации: «Использование памяти показано в читабельных единицах (представление base-2)». Таким образом, чтобы получить байты, умножьте на 1024, например, 451,6 КиБ = 462 438 байт.

> > > df.info ()
...
использование памяти: 70.0+ КБ

> > > df.info (memory_usage = 'глубокий')
...
использование памяти: 451,6 КБ
ответил Brian Burns 11 MonEurope/Moscow2017-12-11T14:06:42+03:00Europe/Moscow12bEurope/MoscowMon, 11 Dec 2017 14:06:42 +0300 2017, 14:06:42
0

Вы должны сделать это в обратном порядке.

In [4]: DataFrame(randn(1000000,20)).to_csv('test.csv')

In [5]: !ls -ltr test.csv
-rw-rw-r-- 1 users 399508276 Aug  6 16:55 test.csv

Технически память об этом (которая включает в себя индексы)

In [16]: df.values.nbytes + df.index.nbytes + df.columns.nbytes
Out[16]: 168000160

Итак, 168 МБ в памяти с файлом 400 МБ, 1 М строк из 20 плавающих столбцов

DataFrame(randn(1000000,20)).to_hdf('test.h5','df')

!ls -ltr test.h5
-rw-rw-r-- 1 users 168073944 Aug  6 16:57 test.h5

НАМНОГО более компактно при записи в виде двоичного файла HDF5

In [12]: DataFrame(randn(1000000,20)).to_hdf('test.h5','df',complevel=9,complib='blosc')

In [13]: !ls -ltr test.h5
-rw-rw-r-- 1 users 154727012 Aug  6 16:58 test.h5

Данные были случайными, поэтому сжатие не слишком помогает

ответил Jeff 7 AM00000010000000831 2013, 01:00:08
0

Я думал, что принесу больше данных для обсуждения.

Я провел серию тестов по этому вопросу.

Используя пакет python resource, я получил использование памяти моего процесса.

И, записав csv в буфер StringIO, я мог легко измерить его размер в байтах.

Я провел два эксперимента, каждый из которых создал 20 кадров данных с увеличивающимися размерами от 10000 до 1000000 строк. Оба имеют 10 столбцов.

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

Так увеличивается объем памяти по сравнению с CSV-файлом в зависимости от количества строк. (Размер в мегабайтах)

Размер памяти и CSV в мегабайтах как функция количества строк с записями с плавающей запятой

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

Размер памяти и CSV в мегабайтах в зависимости от количества строк со строковыми записями

Кажется, что отношение размера CSV к размеру информационного кадра может сильно различаться, но размер в памяти всегда будет больше в 2-3 раза (для размеров кадра в этом эксперименте )

Я хотел бы дополнить этот ответ дополнительными экспериментами, пожалуйста, прокомментируйте, если хотите, чтобы я попробовал что-то особенное.

ответил firelynx 21 J000000Tuesday15 2015, 18:29:36
0

Если вы знаете dtype вашего массива, вы можете напрямую вычислить количество байтов, которое потребуется для хранения ваших данных + некоторые для самих объектов Python. Полезный атрибут массивов numpy: nbytes , Вы можете получить количество байтов из массивов в pandas DataFrame, выполнив

nbytes = sum(block.values.nbytes for block in df.blocks.values())

object Массивы dtype хранят 8 байтов на объект (массивы dtype объекта хранят указатель на непрозрачный PyObject), поэтому, если у вас есть строки в CSV, вы должны принять во внимание, что read_csv превратит их в object массивы dtype и соответствующим образом скорректирует ваши вычисления.

EDIT:

См. numpy страница скалярных типов для получения дополнительной информации о object dtype. Поскольку хранится только ссылка, вам также необходимо учитывать размер объекта в массиве. Как говорится на этой странице, массивы объектов несколько похожи на объекты Python list.

ответил Phillip Cloud 7 AM000000120000002931 2013, 00:38:29
0

Да, есть. Pandas будет хранить ваши данные в двухмерных структурах ndarray, группирующих их по dtypes. ndarray - это в основном необработанный массив данных C с небольшим заголовком. Поэтому вы можете оценить его размер, просто умножив размер dtype, который он содержит, на размеры массива.

Например: если у вас есть 1000 строк с 2 np.int32 и 5 np.float64 столбцов, ваш DataFrame будет иметь один массив 2x1000 np.int32 и один 5x1000 np.float64 массив, который:

4 байта * 2 * 1000 + 8 байтов * 5 * 1000 = 48000 байтов

ответил Viktor Kerkez 7 AM000000120000002831 2013, 00:30:28
0

Это, я считаю, дает размер в памяти любому объекту в python. Внутренние органы должны быть проверены в отношении панд и NumPy

>>> import sys
#assuming the dataframe to be df 
>>> sys.getsizeof(df) 
59542497
ответил Zaher Abdul Azeez 14 12016vEurope/Moscow11bEurope/MoscowMon, 14 Nov 2016 12:18:09 +0300 2016, 12:18:09

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132