【问题标题】:Datatables fails when trying to load 70000 records尝试加载 70000 条记录时数据表失败
【发布时间】:2018-12-03 17:13:19
【问题描述】:

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

很遗憾,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 选项成功运行并延迟加载 70K 记录,我缺少什么?

【问题讨论】:

  • 谁需要同时查看 70K 行?
  • «500 Internal Server Error 是一个非常普遍的 HTTP 状态代码,表示网站服务器出现问题...» ref
  • 前段时间我也遇到过类似的情况,我的问题是我试图从服务器获取的数据溢出了PHPmemory_limit 变量(我认为默认是128MB on php.ini)。您可以尝试增加此值(我的现在是 512MB),但请注意在此处阅读更多内容:haydenjames.io/understanding-php-memory_limit
  • @JohnBeasley 好的,告诉我这是否有帮助,另外,请记住在更改配置文件时重新启动服务器。
  • @JohnBeasley 这种情况的真正解决方案是使用server-side 处理,并且在表上的每个分页/排序/过滤上向服务器发布一个帖子以获取新数据,认为这是一个临时的解决方法,但不是最终解决方案。如果这对其他人有帮助,我会做出回答。

标签: jquery ajax datatables


【解决方案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,并且在每次对表格进行分页、排序或过滤时,都会向服务器发送一个帖子以处理这些操作,并再次获取呈现datatable 的新数据。 DataTables 示例中提供了服务器端处理的实现,请在下一个链接中查看:

(1) Server Side Processing Class Example

【讨论】:

  • 感谢您的意见。我一定会研究服务器端处理。
  • 不客气,这对我来说也是一项悬而未决的任务,因为它需要对我当前的项目进行大量更改。
【解决方案2】:
$(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
    } );
} );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 2016-12-31
    • 2014-09-05
    • 2020-11-19
    • 1970-01-01
    • 2014-07-14
    • 2014-11-26
    相关资源
    最近更新 更多