Datatables не удается при попытке загрузить 70000 записей - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть jQuery datatable, который может быть предоставлен с более чем 70K записями.

К сожалению, datatable не может загрузить что-либо более 20K записей.

Я использую опциюdeferRender в попытке обходного пути, но безрезультатно.

$.ajax({
    url: 'api/portmbs.php',
    type: 'POST',
    data: data,
    dataType: 'html',
    success: function(data, textStatus, jqXHR)
    {
        var jsonObject = JSON.parse(data);

        var table = $('#example1').DataTable({
            "data": jsonObject,
            "columns": [
                {"data": "column_one"},
                {"data": "column_two"},
                // more columns...
            ],
            "iDisplayLength": 25,
            "order": [[ 1, "desc" ]],
            "paging": true,
            "scrollY": 550,
            "scrollX": true,
            "bDestroy": true,
            "stateSave": true,
            "autoWidth": true,
            "deferRender": true
        });
    },
    error: function(jqHHR, textStatus, errorThrown)
    {
        $('#loadingDiv').hide();
        $('#errorModal').modal('show');
        $('.message').text('There was an error conducting your search. Please try again.');
        return false;       
        console.log('fail: '+ errorThrown);
    }
});

При использовании вышеуказанного выдается ошибка с соответствующим сообщением об ошибке:

Не удалось загрузить ресурс:сервер ответил со статусом 500 (Внутренняя ошибка сервера)

Когда я добавляю ограничение 10000 к запросу, генерирующему данные, datatable успешно обрабатывается.

Чего мне не хватает, чтобы получить опцию deferRender для успешного запуска и отсрочки загрузки записей 70 КБ?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018
$(document).ready(function() {
    $('#example').DataTable( {
        serverSide: true,
        ordering: false,
        searching: false,
        ajax: function ( data, callback, settings ) {
            var out = [];

            for ( var i=data.start, ien=data.start+data.length ; i<ien ; i++ ) {
                out.push( [ i+'-1', i+'-2', i+'-3', i+'-4', i+'-5' ] );
            }

            setTimeout( function () {
                callback( {
                    draw: data.draw,
                    data: out,
                    recordsTotal: 5000000,
                    recordsFiltered: 5000000
                } );
            }, 50 );
        },
        scrollY: 200,
        scroller: {
            loadingIndicator: true
        },
        stateSave: true
    } );
} );
0 голосов
/ 03 декабря 2018

Я столкнулся с подобной проблемой некоторое время назад, в моем случае ошибка сервера была вызвана переполнением переменной PHP memory_limit.Значение по умолчанию (внутри php.ini) равно 128MB, поэтому существует вероятность того, что эти 70000+ rows данных, которые вы получаете, переполняются этим ограничением.

В качестве временного обходного пути вы можете попытаться увеличить это ограничениеизмените конфигурацию файла php.ini на сервере и затем перезапустите сервер.Моя текущая конфигурация:

; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
; XXX: Increased from 128 to 512.
memory_limit = 512M

Подробнее об этом вы можете узнать по следующим ссылкам:

(1) http://php.net/manual/en/ini.core.php#ini.memory-limit

(2) https://haydenjames.io/understanding-php-memory_limit/

Как я уже сказал, предыдущее решение следует рассматривать только как обходной путь.Реальным решением проблем такого типа будет использование серверной обработки , и при каждой разбивке на страницы, упорядочивании или фильтрации таблицы отправляйте на сервер сообщение для обработки этих действий и получения новых данных, отображающих *Снова 1026 *.В примерах DataTables доступна реализация обработки на стороне сервера, проверьте ее по следующей ссылке:

(1) Пример класса обработки на стороне сервера

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...