通过 AJAX 处理大型数据集不会带来速度优势

Posted

技术标签:

【中文标题】通过 AJAX 处理大型数据集不会带来速度优势【英文标题】:Processing large data sets via AJAX brings no speed benefits 【发布时间】:2011-11-11 12:16:49 【问题描述】:

我有几个耗时的数据库查询要运行。每个都被构建为从网页上选择的选项触发。我认为通过几个 AJAX 请求来启动工作是相当狡猾的。

我假设多个请求将被拆分到多个进程/线程上,这意味着用户可以相对快速地完成工作。

但是,请求似乎是串行处理的,这意味着用户感觉不到速度优势。

更糟糕的是,更新页面的 AJAX 请求也会排队等待,这意味着它们在之前的请求全部完成之前无法响应。

我有read,这可能是由于 php 会话被锁定造成的。

这类问题的常用方法是什么?

有没有办法强制 AJAX 请求异步工作? 我可以阻止 PHP 锁定会话吗? 我应该通过 cron 使用单独的进程来触发后台工作吗?

谢谢!

NB 这个项目是使用 symfony 框架构建的。

AJAX 使用 jQuery

// Get the content
$.get('/ajax/itemInformation/slug/'+slug, function(data) 
  $('#modal-more-information').html(data);
);

【问题讨论】:

你能显示启动AJAX请求的代码吗?您是否设置了“同步”标志? 问题可能出在 SQL 上。您可能必须包含 SQL 如果您还没有从链接到的原始文章中偶然发现它,this 有一些很好的信息和说明。 【参考方案1】:

如果您在任何给定的 AJAX 请求期间完全使用会话,它们将有效地按请求顺序依次执行。这是由于在操作系统级别锁定了会话数据文件。使这些请求异步的关键是尽快关闭(或从不启动)会话。

您可以使用session_write_close (docs) 尽快关闭会话。我喜欢为此使用几个辅助函数,下面的 set_session_var 函数将打开会话,写入 var,然后关闭会话 - 尽快进出。当页面加载时,您可以调用session_start 来填充$_SESSION 变量,然后立即调用session_write_close。以后只能用下面的set函数写了。

get 函数是完全可选的,因为您可以简单地引用$_SESSION 全局,但我喜欢使用它,因为它提供了一个默认值,并且我可以在代码主体中少一个三元组。

function get_session_var($key=false, $default=null) 
    if ($key == false || strlen($key) < 0)
        return false;
    if (isset($_SESSION[$key]))
        $ret = $_SESSION[$key];
    else
        $ret = $default;
    return $ret;

function set_session_var($key=false, $value=null) 
    if ($key == false || strlen($key) < 0)
        return false;
    session_start();
    if ($value === null)
        unset($_SESSION[$key]);
    else
        $_SESSION[$key] = $value;
    session_write_close();

请注意,一旦 AJAX 请求真正异步,就会有一系列全新的注意事项。现在你必须注意race conditions(你必须警惕一个请求设置了一个可能影响另一个请求的变量) - 你看,随着会话关闭,一个请求对$_SESSION 的更改将不可见另一个请求,直到它重建值。您可以通过在关键使用前立即“重建”$_SESSION 变量来帮助避免这种情况:

function rebuild_session() 
    session_start();
    session_write_close();

...但这仍然容易受到竞争条件的影响。

【讨论】:

谢谢!我将查看 symfony 文档,看看我是否可以禁用特定请求的会话。 希望对您有所帮助!不过,请务必查看我添加的有关竞争条件的内容... :) 谢谢,那应该没问题。这些请求只需要读取会话信息即可找出当前用户。他们不需要写回任何东西。 因为我的请求只是AJAX,所以关闭会话是没有问题的。效果也很好。即使在处理其他请求时,页面也会返回 AJAX 数据。

以上是关于通过 AJAX 处理大型数据集不会带来速度优势的主要内容,如果未能解决你的问题,请参考以下文章

这招可以让Pandas 数据帧处理速度提高400倍!

Weka 中的 KNN 算法永远不会在大型数据集上完成

滚动大型数据集时,PyQt QTableView 速度非常慢

python中有哪些高效的数据结构来存储和处理大型数据集?

VBO 不会绘制,大型数据集

创建大型数据集的邻域列表/紧固