Рендеринг Datatable в Flask очень медленный - PullRequest
0 голосов
/ 30 марта 2020

Как я могу оптимизировать рендеринг данных. Моя таблица PG содержит 35k + строк, датафрейм pandas не такой медленный, но таблица данных занимает очень много времени для рендеринга на моей странице HTML:

app.py

@app.route('/html_one', methods=["POST","GET"])
def referentiel_communes():
    r = requests.get('https://api/', params=payload, verify=False)   
    data_dict = r.json()    
    data_str = json.dumps(data_dict)
    df = pd.read_json(data_str) 
    print(df)
    return render_template('referentiel_communes.html', tables=[df.to_html(table_id = 'html_one',classes="display table table-striped table-bordered")], titles=df.columns.values, header="true")

HTML

<div class="col-sm-12">
    {% for table in tables %}
            <!-- {{titles[loop.index]}} -->
            {{ table|safe }}
    {% endfor %}
</div>

JS

var html_one = $('#html_one').DataTable({
    select: true,
    fixedHeader: true,

});

1 Ответ

0 голосов
/ 30 марта 2020

В вашей функции просмотра много чего происходит.

  1. Вы загружаете данные из API

  2. Вы преобразуете json в строку, а затем в фрейм данных.

  3. Вы выводите фрейм данных в html

  4. Затем вы отправляете все это обратно в браузер

Когда вы учитываете только сетевую задержку от ожидания внешнего API до ожидания его передачи обратно клиенту, это может быть значительной частью ожидания. Также учтите, что 35 000 строк при рендеринге в HTML могут составлять 40-50 МБ, что занимает приличное количество времени для перемещения в сетевой ситуации даже для быстрых соединений.

Если вы создаете очень простые * Страница 1040 * HTML со следующими данными, дублированными 35 000 раз, вы получаете веб-страницу размером 5 МБ, которая считается большой для страницы HTML.

<tr>
  <td>Hi</td>
  <td>Sample Data</td>
</tr>

Представьте, сколько будет больше, если бы каждая строка вашего фрейма данных содержала гораздо больше данных?

Есть много вариантов ускорения, но вот основные принципы:

  • Не хотите, чтобы функция просмотра полагалась на внешний API, если вы можете этого избежать
  • Возможно, вы хотите разбить большие наборы данных на страницы
  • Отправить данные обратно в браузер в менее громоздких форматах, чем HTML (JSON или даже CSV) и позволяют клиенту его анализировать. Это уменьшает сетевую задержку перемещения большого файла.
...