Как отладить / устранить MemoryError, вызванную Pandas DataFame? - PullRequest
0 голосов
/ 06 июля 2018

У меня есть датафрейм Pandas, скажем, data.

На ноутбуке, который является 32-битным и имеет 2 ГБ оперативной памяти, я делаю это:

>>>data.info()

<class 'pandas.core.frame.DataFrame'>
Int64Index: 1000209 entries, 0 to 1000208
Data columns (total 5 columns):
UserID        1000209 non-null int32
MovieID       1000209 non-null int32
Ratings       1000209 non-null int32
Age           1000209 non-null int32
Occupation    1000209 non-null int32
dtypes: int32(5)
memory usage: 58.7 MB

На этом фрейме данных я делаю классификацию RandomForest -

>>>X = data.drop('Ratings', axis = 1)
>>>y = data['Ratings']

>>>from sklearn.model_selection import train_test_split
>>>Xtrain, Xtest, ytrain, ytest = train_test_split(X, y, random_state=1)

>>>from sklearn.ensemble import RandomForestClassifier
>>>model = RandomForestClassifier(n_estimators=100, random_state=0)
>>>model.fit(Xtrain, ytrain)
>>>model.predict(Xtest)

Но выдает следующую ошибку

MemoryError: could not allocate 50331648 bytes

Я чувствую, что это как-то связано со спецификациями ноутбука, которым я пользуюсь, но все же я не понимаю, почему это происходит. Могу ли я в любом случае заняться этим?

1 Ответ

0 голосов
/ 06 июля 2018

Ну, лучший способ - профилировать использование памяти вашего скрипта.Для этого

  1. Установите memory_profiler: pip install --user memory_profiler
  2. Поместите весь свой код в функцию, чтобы построчно профилировать его.Примерно так:

    from memory_profiler import profile
    
    @profile
    def main_model_training()
        # put all the code in here
    
  3. Затем запустите профилирование следующим образом:

    python -m memory_profiler script_name.py
    

Вот пример:

Имеется следующий скрипт:

from memory_profiler import profile
import pandas as pd
import numpy as np

@profile
def something_to_profile():
    df = pd.DataFrame(np.random.randn(1000, 4), columns=list('ABCD'))
    df.count()

something_to_profile()

, выполняющий профилирование следующим образом:

python -m memory_profiler memory_profiling_test.py

Предоставляет следующий построчный профиль памяти:

Line #    Mem usage    Increment   Line Contents
================================================
     5     64.3 MiB     64.3 MiB   @profile
     6                             def something_to_profile():
     7     64.3 MiB      0.0 MiB       df = pd.DataFrame(np.random.randn(1000, 4), columns=list('ABCD'))
     8     64.3 MiB      0.0 MiB       df.count()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...