首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据在应用分页之前旋转和加载整个数据集。

数据在应用分页之前旋转和加载整个数据集。
EN

Stack Overflow用户
提问于 2014-08-19 17:39:21
回答 2查看 1.6K关注 0票数 0

FiddleHere

我有一个表,它加载了很多数据(最多100万行和4-6列),数据不是来自数据库,而是来自API响应,所以我无法分解查询。

我的问题是,取决于响应大小(越大,花费的时间越长),只有整个表被打印出来,数据才会生效。这种情况发生在处理11604行数据时,但您可以想象,当整个web应用程序被包装在这个位置并返回更多数据(比如100,000行)时,情况会变得多么糟糕。

处理这件事最好的方法是什么?我从来没有尝试过显示这么大的数据。

联署材料:

代码语言:javascript
复制
$(document).ready(function() {
    $('#tableStuff').dataTable();
} );

HTML输出:太长了,不能在这里发布

PHP:

代码语言:javascript
复制
//$response = curl response
echo "<table class='display' id='tableStuff'>";
echo "<thead><th>Test 1</th><th>Test 2</th><th>Test 3</th><th>Test 4</th></thead>";
foreach($response as $test){
  echo "<tr><td>". $test['test1'] ."</td><td>" .$test['test2'] ."</td><td>" .$test['test3'] ."</td><td>" .$test['test4'] ."</td><tr>";
}
echo "</tbody></table>";
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-26 08:11:18

大数据集会有几个问题:

  • 网络超时(同时检索结果,同时将其推到客户端,等等)
  • 内存占用(在您的PHP应用程序中,在客户端浏览器中等等)

在客户端

一旦您有了数千行,就必须使用datatable库的ajax特性来加载数据。通过这种方式,您将加载部分数据,并将响应的大小保持在足够小的范围内(并且呈现得很快)。

您可能需要通过卸载以前的数据段来释放一些浏览器内存,同时添加新的数据段。您可以在管道实例中描述这种行为的一部分,其中数据缓存存储在客户端。通过在客户端管理此类数据存储,您可以尝试确保此数据的大小永远不会过高。

这也意味着许多默认的特性在使用服务器端处理时不再可用服务器端处理。也就是说,您不能使用javascript搜索,所有过滤内容也必须在服务器端完成(浏览器上没有完整的数据集,这在大多数浏览器内存中是不合适的)。

在服务器端(B到B)

正如@Luke所述,您必须将结果集存储在数据库中。您不能为每个客户端请求检索它。

这将导致一个新的问题:

  • 您将不得不刷新这个数据,您必须决定可以使用多长时间检索到的数据。

但你还有另外两个问题:

  • 在HTTP中请求不分页数据的数据服务器时,您可能会得到网络超时
  • 当在PHP程序上接收到这些数据时,您将遇到内存问题

为了限制接收到的数据的内存占用,您可能需要在cli模式下运行php.ini (例如通过cron ),其中默认的php.ini通常允许更大的memory_limit设置。从Apache上运行PHP时,您不应该允许memory_limit=1Go,这是个坏主意。

您还可以尝试通过管理基于文件的内存来减少内存使用量,可以使用像内存这样的组件。

但首先,您必须确保curl可以在不崩溃的情况下检索结果。

好吧..。

非常奇怪的是,API服务器没有管理分页。拥有返回数百万行的HTTP是API中的一个问题。如果您对这个API有一些控制,那么就修复它(如果可能的话,让它成为服务器端的datatable API )。如果您对这个APi没有任何控制,那么您必须找到正确的方法来提取小子集中的数据,在本地存储数据(小心您需要一个大型数据库),围绕它构建一个服务器端datatable API,以异步方式刷新数据(crons),重新考虑客户端在ajax模式下工作。

这就是为什么真正的应用程序总是比演示更难构建。

票数 2
EN

Stack Overflow用户

发布于 2014-08-25 23:02:00

考虑到您使用的是PHP,那么如果可能的话,我肯定会建议分割这些数据,并且理想的情况下,查询是基于某个消息队列或cron进行的,而不是在加载页面时。这是一个批量的数据要加载一个网页!

您可以发出curl请求,并将响应缓存在数据库中,然后通过AJAX根据URL参数和加载部分分页。

请参阅http://www.datatables.net/manual/server-side

伪码

代码语言:javascript
复制
<?php // The code that interacts with dataTables
// fetch from database, using pagination
$response = get_page_data($start, $count);

echo "<table class='display' id='tableStuff'>";
echo "<thead><th>Test 1</th><th>Test 2</th><th>Test 3</th><th>Test 4</th></thead>";
foreach($response as $test){
    echo "<tr><td>". $test['test1'] ."</td><td>" .$test['test2'] ."</td><td>" .$test['test3'] ."</td><td>" .$test['test4'] ."</td><tr>";
}
echo "</tbody></table>";

在任何情况下,如果用户必须等待100,000个表行加载和呈现,如果他们的浏览器不简单崩溃的话,我认为您会给用户带来一些挫折。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25389655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档