我有一个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记录,我缺少什么?
答案 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,并且在每次分页时,对表进行排序或过滤都会在服务器上发布帖子以处理这些操作,并获取新数据以再次呈现datatable
。 DataTables
示例中提供了服务器端处理的实现,请在下一个链接上进行检查:
答案 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
} );
} );