Улучшение производительности на стороне сервера - PullRequest
0 голосов
/ 11 января 2019

Я использую таблицы данных в своем приложении rails, и время загрузки начинает замедляться, когда в таблице около 16 000 записей. Я настроил таблицу для обработки данных на стороне сервера и использую гем will_paginate, но время загрузки по-прежнему часто составляет около 5 секунд. Что-нибудь особенно не так с моим кодом ниже, что может привести к такому большому времени загрузки?

Примечание. Я прокомментировал несколько строк в приведенных ниже фрагментах кода, чтобы увидеть, как они повлияли на время загрузки - нет.

Спасибо! -Mike

class AccountsDatatable
  delegate :params, :h, :link_to, :number_to_currency, to: :@view
  attr_reader :user
  include Rails.application.routes.url_helpers
  include Pundit

  def pundit_user
    User.find(@current_user_id)
  end

  def initialize(view, account_status, current_user_id)
    @view = view
    @account_status = account_status
    @current_user_id = current_user_id
    @current_user = User.find(current_user_id)
  end

  def as_json(options = {})
    {
      sEcho: params[:sEcho].to_i,
      iTotalRecords: Account.count,
      iTotalDisplayRecords: accounts.total_entries,
      aaData: data
    }
  end

  private
  def data
    accounts.map do |account|
      [
        account.account_name,
        account.account_status.to_s.humanize,
        #account.get_departments_with_active_opportunities,
        #account.get_departments_with_active_lobs,
        link_to("Open", account_path(account), class: "btn btn-xs btn-success"),
        ((policy(account).update?) ? link_to("Edit", edit_modal_form_accounts_path(id: account.id), class: "btn btn-xs btn-default", remote: true) : " "),
        ((policy(account).destroy?) ? link_to("Delete", delete_modal_form_accounts_path(id: account.id), class: "btn btn-xs btn-danger", remote: true) : " ")
      ]
    end
  end

  def accounts
    @accounts ||= fetch_accounts
  end

  def fetch_accounts
    if @account_status.nil? || @account_status == "all"
      accounts = Account.order("#{sort_column} #{sort_direction}").all
    else
      accounts = Account.order("#{sort_column} #{sort_direction}").where(account_status: @account_status)
    end
    if params[:sSearch].present?
      search = params[:sSearch]
      begin
        accounts = accounts.or( { account_name: (/.*#{search}.*/i) } )
      rescue
        accounts = accounts.or( { account_name: (/^#{::Regexp.escape(search)}$/i) } )
      end
    end
    accounts = accounts.paginate(:page => page, :per_page => per_page)
    accounts
  end

  def page
    params[:iDisplayStart].to_i/per_page + 1
  end

  def per_page
    params[:iDisplayLength].to_i > 0 ? params[:iDisplayLength].to_i : 10
  end

  def sort_column
    columns = %w[account_name account_status] 
    columns[params[:iSortCol_0].to_i] 
  end

  def sort_direction
    params[:sSortDir_0] == "desc" ? "desc" : "asc"
  end

end

Сценарий страницы:

$(document).ready(function () {

    const datatable_options = { 
      sPaginationType: 'full_numbers',
      bProcessing: true,
      bServerSide: true,
      sAjaxSource: $('#accounts_table').data('source'),
      columns: [
        null,
        null,
        // { orderable: false },
        // { orderable: false },
        { orderable: false },
        { orderable: false },
        { orderable: false }
      ]
    };
    initialize_datatable('#accounts_table', datatable_options);
  });

View

<table id = "accounts_table" class="table table-striped accounts_table" data-source="<%= accounts_path(format: "json", account_status: @account_status ) %>" >
          <thead>
            <tr>
              <th>Account Name</th>
              <th>Classification</th>
              <!--<th>Active prospecting departments</th>-->
              <!--<th>Active departments</th>-->
              <th>&nbsp;</th>
              <th>&nbsp;</th>
              <th>&nbsp;</th>
            </tr>
          </thead>
          <tbody>
          </tbody>
        </table>

1 Ответ

0 голосов
/ 12 января 2019

Взгляните на: DataTables работает медленно. Как я могу ускорить это?

Q. DataTables работает медленно. Как я могу ускорить это?
О. Есть несколько способов ускорить DataTables. Часто первый что нужно сделать, это включить подкачку (paging), если это было отключено, поскольку это просто уменьшает количество данных, которые будут отображаться. Кроме того, метод, который вы используете для загрузки данных, будет обычно оказывают наиболее значительное влияние на производительность.

  • Обработка на стороне клиента - данные из DOM: ~ 5000 строк. Варианты скорости: orderClasses.
  • Обработка на стороне клиента - данные из Ajax-источника (ajax): ~ 50 000 строк. Варианты скорости: deferRender
  • Обработка на стороне сервера (serverSide): миллионы строк.

Указанные выше цифры являются лишь ориентировочными. Фактические цифры и влияние на производительность зависят от различных факторов, таких как версия браузера, плагины и т. Д.

...