Pandas DataFrame использует больше памяти, чем заявленоPython

Программы на Python
Ответить
Anonymous
 Pandas DataFrame использует больше памяти, чем заявлено

Сообщение Anonymous »

Моя программа очень проста. Я запускаю его в Jupyter Notebook. Он загружает данные из MongoDB. Сначала я пытался сохранить данные как pandas.DataFrame.

Код: Выделить всё

import pandas as pd
import pymongo

mongo = pymongo.MongoClient("mongodb://localhost:27017/")
data = pd.DataFrame(mongo['stock']['em_users_detail'].find({}).limit(1000000))
Мой диспетчер задач Windows сообщает мне, что моя программа использует около 3000 МБ памяти. Я проверил использование памяти в Python. Следующий код дает тот же результат:

Код: Выделить всё

import psutil
import os

psutil.Process(os.getpid()).memory_info().rss / 1024 ** 2
Затем я проверил данные памяти, которые использует, двумя способами:

Код: Выделить всё

# the first approach
data.memory_usage(deep=True).sum() / 1024 ** 2

# the second appraoch
from pympler import asizeof
asizeof.asizeof(data) / 1024 ** 2
Первый подход дает 837 МБ, а второй — 1675 МБ, что значительно больше. Однако оба результата намного меньше памяти, которую использует моя программа (3000 МБ). Итак, у меня два вопроса:
  • Почему результаты этих подходов так сильно различаются?
  • Что еще может быть используя мою память Python?
Похоже, это проблема с утечкой памяти. Я сомневался, что проблема связана с MongoDB, поэтому попробовал сохранить данные с помощью list.

Код: Выделить всё

import pymongo

mongo = pymongo.MongoClient("mongodb://localhost:27017/")
data = list(mongo['stock']['em_users_detail'].find({}).limit(1000000))
На этот раз моя программа на Python использует 3800 МБ памяти, а asizeof показывает, что данные занимают 3500 МБ памяти, что в некотором роде складывается.
Поэтому я думаю, что проблема не связана с MongoDB. Вместо этого, похоже, это связано с pandas.DataFrame.
Я знаю, что здесь есть аналогичный вопрос: использование памяти Dataframe различается между sys.getsizeof и pandas Memory_usage. Но дело в том, что даже при установке deep=True при вызове Memory_usage в моем DataFrame результаты все равно не совсем совпадают.

Подробнее здесь: https://stackoverflow.com/questions/792 ... it-claimed
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»