【发布时间】:2012-12-07 18:22:20
【问题描述】:
我的问题确实围绕着大量数据的重复使用。
我有大约 50mb 的数据需要在单个 php 页面执行期间重复交叉引用。使用带有表连接的 sql 查询最容易解决此任务。问题是我需要在很短的时间内处理大量数据以及执行此操作所需的查询数量。
我目前正在做的是将每个表的相关部分(通常超过 30% 或 10k 行)转储到一个数组中并循环。表连接总是在一个字段上,所以我建立了一个非常基本的“索引”来识别哪些行是相关的。
系统正常工作。它已经在我的生产环境中使用了一年多,但现在我正试图从中挤出更多的性能。在我正在分析的一个特定页面上,第二高的总时间归因于循环通过这些数组的增量线。它的命中数为 130 万,总执行时间为 30 秒。这代表了大约 8200 次 sql 查询要执行的工作才能达到相同的结果。
我正在寻找的是遇到过这种情况的其他人。我真的不敢相信我是第一个拥有大量需要用 PHP 处理的数据的人。
谢谢!
非常感谢所有在这里提供建议的人。看起来这里并没有像我希望的那样真正的银弹。我想我最终要做的是混合使用 mysql 内存表和某些版本的分页内存缓存。
【问题讨论】:
-
这里有很多人用 php 处理大数据。我不确定你的问题是什么。
-
@rambo coder 我想我在这里想要了解的是如何在本地存储数据?如果没有 sql(或我正在使用的 hack),你如何加入?必须有一个比自定义编码更受欢迎、经过测试的解决方案可供人们使用。
-
您可以将数据存储在适合您特定访问模式的更优化的数据结构中。也有可能您的数据不会经常更改,您可以通过编写一个通过套接字连接回答查询的守护程序将其保存在这种优化的数据结构中的内存中。还有并行处理(将任务分成小块,每个块使用不同的机器)。我的猜测是你可以改进你的代码+数据结构来获得巨大的收益。
-
并行化完全可以解决这个问题。 1000 个对象中的每一个都可以在任何服务器上创建。我现在使用 memcache 来存储数组,但真正节省我的是前期查询和创建时间,这与循环时间相比是很小的。
-
我可能已经超前了。我认为您需要确定的第一件事是您非常精通数据库索引。另外,也许研究一下数据仓库方法,比如星型模式。
标签: php sql large-data