尝试加载70000条记录时数据表失败

时间:2018-12-03 17:13:20

标签: jquery ajax datatables

我有一个jQuery datatable,可以提供超过7万条记录。

不幸的是,datatable无法加载超过2万条记录的任何内容。

我正在尝试使用选项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选项来成功运行并推迟加载70K记录,我缺少什么?

2 个答案:

答案 0 :(得分:1)

前段时间,我遇到了类似的问题,在我的情况下,服务器错误是由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/

就像我说的那样,应该仅将先前的解决方案视为一种解决方法。这类问题的真正解决方案是使用server-side processing,并且在每次分页时,对表进行排序或过滤都会在服务器上发布帖子以处理这些操作,并获取新数据以再次呈现datatableDataTables示例中提供了服务器端处理的实现,请在下一个链接上进行检查:

(1) Server Side Processing Class Example

答案 1 :(得分:0)

$(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
    } );
} );