Я создал локальное приложение, позволяющее студентам эффективно находить и изучать данные (измерений). Чтобы обеспечить дальнейшее развитие, я попытался перейти от 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
Дэш и поляры; Использование оперативной памяти продолжает расти ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Использование памяти продолжает расти при многократном чтении паркетных файлов
Anonymous » » в форуме Python - 0 Ответы
- 44 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Использование памяти продолжает расти при многократном чтении паркетных файлов
Anonymous » » в форуме Python - 0 Ответы
- 48 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Использование памяти продолжает расти при многократном чтении паркетных файлов
Anonymous » » в форуме Python - 0 Ответы
- 54 Просмотры
-
Последнее сообщение Anonymous
-