处理非常大的数组的最佳实践? D B?

时间:2013-08-06 17:28:56

标签: php mysql arrays large-data

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

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

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

  

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

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

其他任何方式吗?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

最简单,最快捷的方法可能是继续使用内存阵列解决方案并弄清楚如何解决内存问题。你遇到的记忆错误是什么?

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

如果您当前的系统上没有足够的RAM。我建议尝试亚马逊EC2,你可以在现货市场上以每小时7美分的价格购买一台16GB的机器,只要你需要生成图表,你就可以停下来开始。

答案 2 :(得分:0)

您能否就您的使用案例提供更多细节?您需要服务多少个不同的图表?基础数据的变化频率如何?您需要服务多少并发用户?你真的试图在一张图表上绘制200万个元素吗?

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

  1. 离线构建图表并缓存它们
  2. 使用基于网络的解决方案卸载所有查询和图表生成(google charts + google fusion table)
  3. 使用后端进程进行分析并生成图表,仅将最终结果公开给客户端。查看R和http://www.rstudio.com/shiny/