Проблема с оперативной памятью при создании DataFrame с большим количеством столбцов из набора данных TensorFlow.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Проблема с оперативной памятью при создании DataFrame с большим количеством столбцов из набора данных TensorFlow.

Сообщение Anonymous »

Я работаю с большими объемами данных, которые обрабатываю с помощью набора данных TensorFlow (TFDS) и сохраняю в pandas.DataFrame. Моя цель — преобразовать данные из одного формата в другой для дальнейшего анализа. Но когда я создаю DataFrame с большим количеством столбцов (~8500), моя оперативная память быстро заполняется, и процесс завершается с ошибкой нехватки памяти.
Текущий код:

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

import tensorflow as tf
import pandas as pd
from tqdm import tqdm

datapoint_indices = [x[0] for x in filtered_ranking_table]

# Empty DataFrame to store results
column_names = ["class"]
column_names += [f'datapoint_{i}' for i in datapoint_indices]
# df = pd.DataFrame(columns=column_names)
# max_rows = 114003  # or some other upper limit
# df = pd.DataFrame({name: [None] * 162078 for name in column_names})

# Trying to create a DataFrame with a fixed number of rows
# max_rows = 114003  # Row limit
# df = pd.DataFrame(index=range(max_rows), columns=column_names)

df = pd.DataFrame({name: [np.nan] * 162078 for name in column_names})

for datapoint_n, clusters in tqdm(dataset.take(114003), total=114003):
if datapoint_n.numpy() in datapoint_indices:
prev_index = len(df)  # Current length of df
for i, cluster in enumerate(clusters):
cluster = cluster.numpy()
cluster = [x for x in cluster if x != 0]
df.loc[prev_index:prev_index + len(cluster) - 1, 'class'] = i
df.loc[prev_index:prev_index + len(cluster) - 1, f'datapoint_{datapoint_n}'] = pd.Series(cluster, index=range(prev_index, prev_index + len(cluster)))
prev_index += len(cluster)

df = df.dropna(how='all')
df = df.astype({"class": int})

Что я пробовал до сих пор:
  • Создание пустого DataFrame с фиксированными строками (

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

    max_rows
    ) и динамическое количество столбцов (

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

    datapoint_indices
    ).
  • Использование цикла for для заполнения столбца данных блоками, как в приведенном выше коде, что помогает при небольшом количестве столбцов, но не работает для 8500. + столбцы из-за нехватки оперативной памяти.
Вопросы:
  • Как это может оптимизировать процесс для уменьшения потребления памяти?
  • Есть ли способ записать данные непосредственно в файл (например, Parquet, CSV или HDF5) ) вместо загрузки в оперативную память?
  • Какие подходы могут помочь с таким объемом данных и количеством столбцов?
Будем признательны за любые советы по оптимизации или способам сохранения данных непосредственно в файл.

Подробнее здесь: https://stackoverflow.com/questions/791 ... mns-from-a
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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