Дэш и поляры; Использование оперативной памяти продолжает растиPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Дэш и поляры; Использование оперативной памяти продолжает расти

Сообщение Anonymous »

Я создал локальное приложение, позволяющее студентам эффективно находить и изучать данные (измерений). Чтобы обеспечить дальнейшее развитие, я попытался перейти от pandas &uckdb к полярам. После нескольких недель работы над интеграцией его в это обширное приложение я понял, что столкнулся с серьезной проблемой.
Раньше приложение работало стабильно, но теперь с полярами, объем оперативной памяти ( процесса pythonw.exe) всплывающие окна с каждым последующим обратным вызовом. Хотя приложение начинается с размера около 100 МБ; каждый обратный вызов добавляет что-то вроде 5 МБ. Кажется, я не стабилизировался; при 1500 МБ он все еще рос.
Я как бы застрял и был бы очень признателен за советы, как решить эту проблему.
Я сделал минимальный пример, иллюстрирующий проблему. Если я запущу его с «polars_check=True», то начну с 98 МБ, а после 100 итераций оно станет 261 МБ. Если я сделаю это с параметром «polars_check»=False (т. е. pandas), то я начну и закончу с 98 МБ.
import pathlib, os, shutil
import polars as pl, pandas as pd, numpy as np, datetime as dt

from dash import Dash, dcc, html, Input, Output
import plotly.graph_objects as go

#Check-input
polars_check = True ### Whether the example returns with polars or with pandas.

if polars_check: #To accomdate the slower data retrieval with pandas.
interval_time = 3E3
else:
interval_time = 3E3

#Constants
folder = pathlib.Path(r'C:\PerovskiteCell example')

n_files = 100 #Number of files in folder
n_lines = 500000 #Number of total lines in folder
n_cols = 25

#Generating sample data in example folder (Only once).
if not folder.exists():

size = int(n_lines / n_files)
col = np.linspace(-1E3, 1E3, num=size)

df = pl.DataFrame({f'col{n}': col for n in range(n_cols)})

# Creating folder & files
os.makedirs(folder)

f_path0 = folder.joinpath('0.csv')
df.write_csv(f_path0)

for n in range(1, n_files):
shutil.copy2(f_path0, folder.joinpath(f'{n}.csv'))

#Functions
def pl_data():
"""Retrieves data via the polars route"""

lf = (pl.scan_csv(folder.joinpath(f'{n}.csv'),
schema={f'col{n}': pl.Float64 for n in range(n_cols)})

.select(pl.all().get(n)) for n in range(n_files))

lf = pl.concat(lf)
lf = lf.select('col0', 'col1')

return lf.collect()

def pd_data():
"""Retrieves data via the pandas route"""

dfs = (pd.read_csv(folder.joinpath(f'{n}.csv'), usecols=['col0', 'col1']).iloc[n:n+1]
for n in range(n_files))

return pd.concat(dfs, ignore_index=True)

#App (initialization)
app = Dash()
app.layout = html.Div([dcc.Graph(id='graph'),
dcc.Interval(id = 'check',
interval = interval_time,
max_intervals = 100)])

@app.callback(
Output('graph', 'figure'),
Input('check', 'n_intervals'))

def plot(_):

#Data retrieval
if polars_check:
df = pl_data()
else:
df = pd_data()

#Plotting
fig = go.Figure()
trace = go.Scattergl(x = list(df['col0']), y=list(df['col1']), mode='lines+markers')

fig.add_trace(trace)
fig.update_xaxes(title = str(dt.datetime.now()))

return fig

if __name__ == '__main__':
app.run(debug=False, port = 8050)


Подробнее здесь: https://stackoverflow.com/questions/788 ... increasing
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

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

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