1

在另一个问题中,我说我正在运行一个 php 脚本,该脚本从 mysql 数据库中获取 150 行数据,然后对该数据进行一些计算,然后将其放入一个数组中(120 个元素,每个元素包含 30 个数组,或者总共大约 3600 个元素)。需要“结果”数组,因为我用数据创建了一个图表。这个脚本工作正常。

我想将我的脚本扩展到更密集的数据集(这将提供更好的结果)。数据集有 1700 行,最终会得到一个包含 1340 个元素的“结果”数组,每个元素包含 360 个数组,或者总共大约 482,400 个元素。问题是,我已经尝试过这个并想出了一些令人发指的内存错误。

正如在我发布的上一个问题中向我描述的那样,该结果数组的大小可能会压倒服务器内存

在您的第二个较大样本中,它将是数组(1700,1699)。每个元素 144 字节,即 415,915,200 字节,略高于 406Meg + 剩余存储桶空间,仅用于保存计算结果。

我不熟悉处理这个问题的典型方法。我正在考虑更大的数据集,在运行时对 1340 个结果数组元素中的每一个进行序列化和 base64_encode 编码(或者每 10 或 20 个。1340 db 调用可能太多了),并上传到 SQL 服务器,以及取消设置结果数组以释放内存。然后我可以通过在数据库中查询特定信息来制作我的报告和图表,而不是将它们全部放在一个巨大的数组中。

还有其他方法吗?

4

3 回答 3

0

在处理大量数据时,您可能应该使用 Hadoop map-reduce 和/或其他此类技术。而且你想对数据做的大部分处理都必须是批处理。结果必须放在其他地方——另一个数据库。您只需要查询该数据库,您的应用程序就会变得更快,并且您不会遇到内存问题。

于 2013-08-06T17:46:54.870 回答
0

最简单和最快的方法可能是继续使用您的内存阵列解决方案并找出解决内存问题的方法。您遇到过哪些内存错误?

如果您有超过 1GB 的 RAM,则足以生成图表。使用 1GB 的 RAM,您可以将 memory_limit PHP 配置选项设置为 750MB。您一次只能使用一个进程生成它,因此您需要生成它并使用某种方法来缓存结果。

如果您当前的系统上没有足够的 RAM。我建议尝试使用 Amazon EC2,您可以在现货市场上以每小时约 7 美分的价格获得一台 16GB 机器,您可以在需要生成图表时停止并启动它。

于 2013-08-06T18:01:40.937 回答
0

你能提供更多关于你的用例的细节吗?您需要服务多少个不同的图表?基础数据多久会更改一次?你需要服务多少并发用户?您是否真的想在一张图表上绘制 200 万个元素?

在没有具体细节的情况下,我会注意/推荐以下一些组合:

  1. 离线构建图表并缓存它们
  2. 使用基于 Web 的解决方案来卸载所有查询和图表生成(谷歌图表 + 谷歌融合表)
  3. 使用后端进程进行分析并生成图表,仅将最终结果公开给客户端。查看 R 和http://www.rstudio.com/shiny/
于 2013-08-06T18:47:23.450 回答