如何处理服务器端模拟的大型数据集 - >客户端浏览器

Mar*_*rkD 5 javascript php ajax web-applications dataset

对不起有点令人困惑的标题.不确定如何标题这个.我的情况是这样的 - 我有一个学术模拟工具,我正在开发一个Web前端.虽然基于C++的模拟器对于小型系统而言在计算上非常高效(几百分之一到十分之一秒的运行时间),但它可以生成一个重要的(在Web应用程序术语中)数据量(~4-6mb).

目前的设置如下 -

  1. 用户访问index.html文件.左侧的此页面具有交互式表单,用户可以在其中输入模拟参数.右侧是他们正在创建的系统的表示,以及用于模拟数据的各种图的一些灰色选项卡.
  2. 用户点击"运行模拟".这通过AJAX调用将请求的sim参数提交给runSimulation.php文件.runSimulation.php根据提交的数据创建输入文件,然后使用此输入文件运行模拟器.模拟器在各种输出文件中吐出4-6mb的数据.
  3. 模拟运行完毕后,对浏览器的响应是另一个调用文件returnData.php的javascript函数.这个php脚本将输出文件中的数据打包为JSON数据,将JSON数据返回给浏览器,然后删除数据文件.
  4. 然后将此响应数据提供给浏览器的javascript中的一些绘图对象,并且绘图选项卡变为活动状态.然后,用户可以打开并与绘制的数据交互.

这个设置工作正常,但我遇到两个问题:

  • 返回数据很慢 - 4-6mb的数据返回可能需要一段时间才能加载.(该数据正在被gzip压缩,这大大减少了它的侧面,但在较慢的连接上仍然需要20多秒)
  • 下一个目标是允许用户绘制多个模拟运行,以便他们可以比较结果.

我的想法是,我可能希望将数据文件保留在服务器上,而用户会话处于活动状态.这将使得能够仅加载用户想要查看的图的数据(并且可能在他们查看当前图的结果时在后台加载其他数据).对于多次运行,我可以在服务器上放置多个数据集,以便用户在需要时可以下载.

但是,我对这一思路有一个很大的问题 - 如何识别(在php中)用户已离开服务器并删除数据?我不希望用户接管机器上的驱动器空间.对这种网络应用程序的最佳实践有何想法?

Nul*_*ion 1

对于问题#1,你实际上没有任何选择。您已经对数据进行了 Gzip 压缩,并使用 JSON,这是一种相对轻量级的格式。4~6MB的数据确实很多。顺便说一句,如果您认为 PHP 生成数据的时间太长,您可以使用 C++ 程序生成数据并使用 PHP 提供服务。您可以使用exec()来做到这一点。

然而,我不确定你的模拟是如何工作的,但 Javascript 是一种图灵完备的语言,所以你可能会在客户端生成一些/大部分/全部这些数据(无论什么更有意义)。在这种情况下,您将节省大量带宽并显着减少加载时间 - 但请注意 JS 可能非常慢。

对于问题#2,如果您将数据留在服务器上,您将需要跟踪活动会话(即:用户最后一次与服务器交互是什么时候),并设置对您的应用程序有意义的超时。超时后,您可以删除数据。

要跟踪交互,您可以使用 JS 来检查用户是否处于活动状态(通过发送心跳或类似的方式)。