Я тестирую использование памяти пандами с текстовыми корпусами различной длины. Использование памяти противоречиво, и я пытаюсь понять, почему.
У меня есть два текстовых корпуса совершенно разной длины (корпус ревущих обзоров: ~ 6 миллионов слов - и Британский национальный корпус ~ 100 миллионов слов). Я использую два кадра данных панд для хранения и манипулирования этими данными. Форма и типы данных двух корпусов идентичны. В каждом кадре данных каждая строка представляет собой одно слово, а каждый столбец представляет собой часть метаданных об этом слове (например, тег части речи, лемма, идентификатор текста слова). Тип данных всех столбцов в обоих фреймах данных является категорией, поскольку все значения являются строками, и большинство из них повторяются. Использование
dataframe.memory_usage(deep=True, index=True).sum()
Панды говорят, что корпус Yelp занимает около 0,2 ГБ, а BNC - около 1,8 ГБ. Несмотря на то, что BNC примерно в 17 раз больше, чем тявканье, оно занимает в девять раз больше памяти. ОК, честно, корпуса разные. Они не сопоставимы напрямую. Если я конкатенирую тявканье тела до конца BNC и выскажу категориальные переменные, используя
pandas.concat([bnc, yelp]).astype('category')
Я ожидаю, что результирующий фрейм данных займет чуть менее 2 ГБ памяти (1,8 + 0,2 - уровни служебных и дублированных категорий в двух корпусах), но на самом деле он занимает 3,2 ГБ. Кроме того, если я удвою корпус yelp с помощью pandas.concat ([yelp, yelp]), использование памяти увеличится примерно до 0,4 ГБ. С другой стороны, если я удваиваю BNC, используя тот же код, объем используемой памяти увеличивается до 5,2 ГБ, почти в три раза больше, чем у исходного корпуса.
Я читал о том, как панды представляют серии / кадры данных в памяти, но ничего, что я не могу найти, объясняет это. Мне также жаль говорить, что я не могу предоставить ссылки на корпорации, поскольку у меня нет разрешения на их распространение. Я надеюсь, что кто-то может предоставить информацию, а не код.