Как избежать нехватки памяти при чтении датасета?

Подскажите, пожалуйста, как избежать данной ошибки при чтении датасета?

введите сюда описание изображения


Ответы (1 шт):

Автор решения: MaxU

Судя по ошибке вы используете Python 32-bit и соответственно в Python максимально доступно 2 GiB памяти. В наше время трудно найти компьютер, на котором меньше 4 GiB памяти и с 32-разрядной OS. Скорее всего вы можете просто переустановить Python с архитектурой 64-bit и у вас станет больше доступной для интерпретатора Python памяти.

Если же у вас супердревнее железо и вы не можете выйти за предел 32-битной архитектуры, тогда можно попытаться заняться микрооптимизацией - использовать "int16" / "int32", вместо "int64", которые Pandas использует по умолчанию.

Пример - по умолчанию используется около 215 MiB памяти:

In [13]: df = pd.read_csv("201809-citibike-tripdata.csv.zip", parse_dates=["starttime", "stoptime"])

In [14]: df.memory_usage().sum() / 1024**2
Out[14]: 214.90689086914062

Явно указываем типы данных:

In [18]: dtypes = {
    ...:     "tripduration": "int32",
    ...:     "bikeid": "int32",
    ...:     "birth year": "int16",
    ...:     "gender": "int8",
    ...:     "start station id": "float32",
    ...:     "start station latitude": "float32",
    ...:     "start station longitude": "float32",
    ...:     "end station id": "float32",
    ...:     "end station latitude": "float32",
    ...:     "end station longitude": "float32",
    ...: }

In [19]: df = pd.read_csv("201809-citibike-tripdata.csv.zip", parse_dates=["starttime", "stoptime"], dtype=dtypes)

In [20]: df.memory_usage().sum() / 1024**2
Out[20]: 134.31685256958008

In [21]: df.dtypes
Out[21]:
tripduration                        int32
starttime                  datetime64[ns]
stoptime                   datetime64[ns]
start station id                  float32
start station name                 object
start station latitude            float32
start station longitude           float32
end station id                    float32
end station name                   object
end station latitude              float32
end station longitude             float32
bikeid                              int32
usertype                           object
birth year                          int16
gender                               int8
dtype: object

выигрыш - 80.6 MiB или 62.5% от изначального объема занимаемой памяти:

In [22]: 214.90689086914062 - 134.31685256958008
Out[22]: 80.59003829956055

In [23]: 134.31685256958008/214.90689086914062
Out[23]: 0.6250002130055812
→ Ссылка