Я хочу дать более полный ответ, основанный на большинстве потенциальных решений, которые уже предоставлены. Я также хочу указать на еще одну потенциальную помощь, которая может помочь процессу чтения.
Вариант 1: dtypes
«dtypes» - довольно мощный параметр, который вы можете использовать для уменьшения нагрузки на память read
методов. Смотрите это и этот ответ. Панды, по умолчанию, пытаются определить типы данных.
Обращаясь к структурам данных, для каждой сохраненной информации происходит распределение памяти. На базовом уровне обратитесь к значениям ниже (в таблице ниже приведены значения для языка программирования C):
The maximum value of UNSIGNED CHAR = 255
The minimum value of SHORT INT = -32768
The maximum value of SHORT INT = 32767
The minimum value of INT = -2147483648
The maximum value of INT = 2147483647
The minimum value of CHAR = -128
The maximum value of CHAR = 127
The minimum value of LONG = -9223372036854775808
The maximum value of LONG = 9223372036854775807
Обратитесь к этой странице, чтобы увидеть соответствие между типами NumPy и C.
Допустим, у вас есть массив целых чисел . Вы можете как теоретически, так и практически назначить, скажем, массив 16-битного целочисленного типа, но тогда вы выделите больше памяти, чем вам нужно для хранения этого массива. Чтобы предотвратить это, вы можете установить dtype
опцию на read_csv
. Вы не хотите хранить элементы массива в виде длинного целого числа, где на самом деле вы можете поместить их в 8-битное целое число ( np.int8
или np.uint8
).
Обратите внимание на следующую карту dtype.
Источник: https://pbpython.com/pandas_dtypes.html
Вы можете передать dtype
параметр в качестве параметра в методах pandas как параметр read
типа {column: type}.
import numpy as np
import pandas as pd
df_dtype = {
"column_1": int,
"column_2": str,
"column_3": np.int16,
"column_4": np.uint8,
...
"column_n": np.float32
}
df = pd.read_csv('path/to/file', dtype=df_dtype)
Вариант 2: Чтение чанками
Чтение данных по частям позволяет вам получить доступ к части данных в памяти, и вы можете применить предварительную обработку к вашим данным и сохранить обработанные данные, а не необработанные данные. Было бы намного лучше, если бы вы комбинировали эту опцию с первой, dtypes .
Я хочу указать разделы поваренной книги панд для этого процесса, где вы можете найти их здесь . Обратите внимание на эти два раздела там;
Вариант 3: Dask
Dask - это фреймворк, который определен на веб-сайте Dask как:
Dask обеспечивает расширенный параллелизм для аналитики, обеспечивая масштабируемость для любимых инструментов
Он был рожден, чтобы покрыть необходимые части, куда панды не могут добраться. Dask - это мощная инфраструктура, которая предоставляет вам гораздо больший доступ к данным за счет их распределенной обработки.
Вы можете использовать dask для предварительной обработки ваших данных в целом, Dask заботится о фрагментации, поэтому в отличие от pandas, вы можете просто определить этапы обработки и позволить Dask выполнять всю работу. Dask не применяет вычисления до тех пор, пока они явно не выдвинуты compute
и / или persist
( разницу см. В ответе здесь ).
Другие средства (идеи)
- ETL поток предназначен для данных. Хранение только того, что необходимо из необработанных данных.
- Сначала примените ETL ко всем данным с помощью таких платформ, как Dask или PySpark, и экспортируйте обработанные данные.
- Затем посмотрите, могут ли обработанные данные быть помещены в память в целом.
- Рассмотрите возможность увеличения вашей оперативной памяти.
- Рассмотрите возможность работы с этими данными на облачной платформе.