Преобразуйте огромный фрейм данных Polars в диктовку, не потребляя слишком много оперативной памяти.Python

Программы на Python
Anonymous
Преобразуйте огромный фрейм данных Polars в диктовку, не потребляя слишком много оперативной памяти.

Сообщение Anonymous »

Когда я загружаю файл паркета в Polars DataFrame, он занимает около 5,5 ГБ ОЗУ. Polars великолепен по сравнению с другими вариантами, которые я пробовал. Однако Polars не поддерживает создание индексов, подобных Pandas. Для меня это проблематично, поскольку один столбец в моем DataFrame уникален, а шаблон доступа к данным в df в моем приложении — это поиск строк на основе уникального столбца (аналогично dict).
Поскольку фрейм данных огромен, фильтрация обходится слишком дорого. Однако мне, похоже, не хватает оперативной памяти (32 ГБ). В настоящее время я конвертирую df в «куски» следующим образом:

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

h = df.height # number of rows
chunk_size = 1_000_000  # split each rows

b = (np.linspace(1, math.ceil(h/chunk_size), num=math.ceil(h/chunk_size)))
new_col = (np.repeat(b, chunk_size))[:-( chunk_size - (h%chunk_size))]
df = df.with_columns(polars.lit(new_col).alias('new_index'))
m = df.partition_by(by="new_index", as_dict=True)

del df
gc.collect()

my_dict = {}
for key, value in list(m.items()):
my_dict.update(
{
uas: frame.select(polars.exclude("unique_col")).to_dicts()[0]
for uas, frame in
(
value
.drop("new_index")
.unique(subset=["unique_col"], keep='last')
.partition_by(by=["unique_col"],
as_dict=True)
).items()
}
)
m.pop(key)
Потребление оперативной памяти, похоже, не сильно изменилось. Кроме того, я получаю сообщение об ошибке, сообщающее, что размер dict изменился во время итерации (правда). Но что я могу сделать? Является ли увеличение оперативной памяти единственным вариантом?

Подробнее здесь: https://stackoverflow.com/questions/751 ... o-much-ram

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