【发布时间】:2014-08-23 09:01:33
【问题描述】:
所以我正在使用 MVC 4 C#/Razor,并且正在开发一个使用 SlickGrid 来显示网格数据的页面。一切正常,除非我尝试使用它来显示大量数据(大约 100 万行)。
当这种情况发生时,它似乎做得很好,直到它即将完成。就在似乎要完成所有数据加载的时候,网页崩溃了。我使用 getJSON 从 SQL 数据库中提取数据。我按列进行,分批 300000 条记录。我曾尝试使用 Chrome 内存分析工具,但找不到任何有用的东西。下面是一些代码sn-ps:
function pullAllGridData(tableName, colArray)
{
for (var i = 0; i < colArray.length; i++)
{
fetchColumn(tableName, colArray[i], 0);
}
}
function fetchColumn(tableName, fieldName, startAt)
{
$.getJSON('/WIMenu/GetTableData', { tableName: tableName, fieldName: fieldName }, function (data)
{
if (data.slice(-1) !== '~')
{
var startPass = populateSlickData(data, fieldName, startAt);
colStatus[fieldName] = true;
if (loadFirstBatch())
{ populateGrid(); }
fetchColumn(tableName, fieldName, startPass);
}
else
{
data = data.slice(0, -1);
populateSlickData(data, fieldName, startAt);
colStatus[fieldName] = true;
if (loadFirstBatch())
{ populateGrid(); }
}
});
}
function populateSlickData(input, fieldName, startAt)
{
var output = startAt;
var valueArray = input.split('|');
output += valueArray.length;
if (!isInBlackList(fieldName, tableName))
{
var datatype = columns[getColumnIndex(fieldName)].datatype;
var startIndex = startAt;
var endIndex = startAt + valueArray.length;
var counter = 0;
alert(fieldName + ': startIndex: ' + startIndex + ' endIndex: ' + endIndex + ' count: ' + endIndex-startIndex);
for (var x = startIndex; x < endIndex; x++)
{
if (!slickdata[x])
{ slickdata[x] = {}; }
if (valueArray[x - startAt] == 'null') { valueArray[x - startAt] = ''; }
if (datatype == 'System.DateTime')
{
if (valueArray[x-startAt] !== '')
{
var date = new Date(valueArray[x - startAt]);
valueArray[x - startAt] = (date.getMonth() + 1) + '-' + date.getDate() + '-' + date.getFullYear();
}
}
else if (datatype == 'System.Decimal' || datatype == 'System.Int32' || datatype == 'System.Int16' || datatype == 'System.Int64')
{
valueArray[x - startAt] = parseFloat(valueArray[x - startAt]);
}
slickdata[x][fieldName] = valueArray[x - startAt];
counter++;
}
}
currentColumn = fieldName;
filteredData = slickdata;
return output;
}
fetchColumn 使用递归来不断获取列数据,直到所有数据都被接收。 populateGrid 方法只是将 SlickGrid 对象同步到 slickdata 对象。我的目标是找出页面崩溃的原因并了解如何修复它。
通过使用警报,它似乎在某些时候卡在 populateSlickData 方法的 for 循环中,我不知道为什么。我已经尝试打印用于索引的数据,但似乎一切正常。
【问题讨论】:
-
真的很有意思,递归真的有必要吗?只执行一个 ajax 调用并返回所有内容不是更有效吗?
-
@gustavodidomenico - 我在示例中看不到任何递归......确实有回调再次调用 out 函数,但我不会称之为递归。
-
旁注:在其他职业中,它可能被称为wing load test...事实上,如果您对其施加足够的负载,任何软件/硬件都会损坏。有些更抗拒,但真的有 100 万条记录可以在浏览器中显示?
-
我认为人们只见树木不见森林。他同时将一百万行数据加载到内存中。
-
一百万行,来自 JSON,在浏览器中。当然,服务器可以处理该负载,但即使浏览器可以保存那么多数据/许多对象,渲染它也不会顺利进行。
标签: c# asp.net-mvc slickgrid