Я работаю с большими объемами данных, которые обрабатываю с помощью набора данных 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 с фиксированными строками (
Использование цикла for для заполнения столбца данных блоками, как в приведенном выше коде, что помогает при небольшом количестве столбцов, но не работает для 8500. + столбцы из-за нехватки оперативной памяти.
Вопросы:
Как это может оптимизировать процесс для уменьшения потребления памяти?
Есть ли способ записать данные непосредственно в файл (например, Parquet, CSV или HDF5) ) вместо загрузки в оперативную память?
Какие подходы могут помочь с таким объемом данных и количеством столбцов?
Будем признательны за любые советы по оптимизации или способам сохранения данных непосредственно в файл.
Я работаю с большими объемами данных, которые обрабатываю с помощью набора данных TensorFlow (TFDS) и сохраняю в pandas.DataFrame. Моя цель — преобразовать данные из одного формата в другой для дальнейшего анализа. Но когда я создаю DataFrame с большим количеством столбцов (~8500), моя оперативная память быстро заполняется, и процесс завершается с ошибкой нехватки памяти. Текущий код: [code]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)
[/code] Что я пробовал до сих пор: [list] [*]Создание пустого DataFrame с фиксированными строками ([code]max_rows[/code]) и динамическое количество столбцов ([code]datapoint_indices[/code]). [*]Использование цикла for для заполнения столбца данных блоками, как в приведенном выше коде, что помогает при небольшом количестве столбцов, но не работает для 8500. + столбцы из-за нехватки оперативной памяти. [/list] Вопросы: [list] [*]Как это может оптимизировать процесс для уменьшения потребления памяти? [*]Есть ли способ записать данные непосредственно в файл (например, Parquet, CSV или HDF5) ) вместо загрузки в оперативную память? [*]Какие подходы могут помочь с таким объемом данных и количеством столбцов? [/list] Будем признательны за любые советы по оптимизации или способам сохранения данных непосредственно в файл.
Yesterday I tried to open a *.txt file larger than 3 MB with android. Why can't android open it? Previously I had tried to open that file with Windows with the same RAM capacity and Processor speed.
В неудачной ситуации, когда цикл по строкам фрейма данных Pandas является единственным способом продолжить, обычно упоминается, что itertuples() предпочтительнее iterrows() с точки зрения скорости вычислений. Это утверждение справедливо для фреймов...
В неудачной ситуации, когда цикл по строкам фрейма данных Pandas является единственным способом продолжить, обычно упоминается, что itertuples() предпочтительнее iterrows() с точки зрения скорости вычислений. Это утверждение справедливо для фреймов...
В неудачной ситуации, когда цикл по строкам фрейма данных Pandas является единственным способом продолжить, обычно упоминается, что itertuples() предпочтительнее iterrows() с точки зрения скорости вычислений. Это утверждение справедливо для фреймов...
У меня есть образец набора данных временных рядов (23, 14291), который для некоторых пользователей представляет собой сводную таблицу для подсчета за 24 часа; Я пытаюсь отфильтровать некоторые столбцы/функции, которые не имеют характера, основанного...