Как избежать нехватки памяти при чтении датасета?
Ответы (1 шт):
Судя по ошибке вы используете 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
