Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于重复大数据和数组处理的PHP_Php_Sql_Large Data - Fatal编程技术网

用于重复大数据和数组处理的PHP

用于重复大数据和数组处理的PHP,php,sql,large-data,Php,Sql,Large Data,我的问题实际上围绕着大量数据的重复使用 我有大约50mb的数据,需要在单个php页面执行期间重复交叉引用。通过使用带有表联接的sql查询,最容易解决此任务。问题在于我需要在极短的时间内处理的数据量和执行此操作所需的查询数量 我目前正在做的是将每个表的相关部分(通常超过30%或10k行)转储到一个数组中并循环。表连接总是在单个字段上,因此我构建了一个非常基本的排序“索引”,以确定哪些行是相关的 系统工作正常。它已经在我的生产环境中使用了一年多,但现在我正试图从中获得更多的性能。在我分析的一个特定页

我的问题实际上围绕着大量数据的重复使用

我有大约50mb的数据,需要在单个php页面执行期间重复交叉引用。通过使用带有表联接的sql查询,最容易解决此任务。问题在于我需要在极短的时间内处理的数据量和执行此操作所需的查询数量

我目前正在做的是将每个表的相关部分(通常超过30%或10k行)转储到一个数组中并循环。表连接总是在单个字段上,因此我构建了一个非常基本的排序“索引”,以确定哪些行是相关的

系统工作正常。它已经在我的生产环境中使用了一年多,但现在我正试图从中获得更多的性能。在我分析的一个特定页面上,第二高的总时间归因于循环通过这些数组的增量行。它的命中率为130万,总执行时间为30秒。这代表了大约8200个sql查询为实现相同结果而进行的工作

我要找的是其他有过类似情况的人。我真不敢相信我是第一个拥有大量需要用PHP处理的数据的人

谢谢



非常感谢大家在这里提供了一些建议。看起来这里并没有我希望的银弹。我想我最终要做的是混合使用mysql内存表和某个版本的分页memcache。

好吧,我看到了一个类似的情况,在这种情况下,我有大量数据要处理,并且可以选择通过mysql查询尝试做同样多的事情,或者将其卸载到PHP

到目前为止,我的经验是:

  • PHP比使用MySQL查询慢得多

  • MySQL查询速度只有在我将逻辑塞进单个调用时才可以接受,因为调用之间的延迟很严重


  • 我特别震惊的是,PHP在循环少量数据方面的速度是如此之慢。我一直在想/希望我做错了什么…

    这个解决方案很大程度上取决于您对数据的处理,但我发现,在数组键中使用唯一值列可以大大加快查找给定列上特定值的行的速度。 这是因为php使用哈希表来存储键以进行快速查找。它比在数组上迭代或使用数组搜索快数百倍。 但是如果没有看到代码示例,就很难说了

    从评论中添加:


    下一步是使用一些内存数据库。你可以使用,或者。还取决于您控制了多少运行环境,因为这些方法需要的内存比共享主机提供程序通常允许的内存更多。由于分组、排序、聚合函数等原因,它可能还会简化代码。

    这里有很多人用php处理大数据。我不确定你的问题是什么。@rambo coder我想我在这里想了解的是,如何在本地存储数据?如果没有sql(或我正在使用的hack),您如何加入?必须有一种更受欢迎、经过测试的解决方案供人们使用,而不是对其进行自定义编码。您可以将数据存储在更优化的数据结构中,该结构适合您的特定访问模式。也有可能您的数据不会经常更改,您可以通过编写一个守护进程来回答套接字连接上的查询,从而将数据保存在内存中,并保存在这个优化的数据结构中。还有并行处理(将任务分成小块,每个小块使用不同的机器)。我的猜测是你可以改进你的代码+数据结构来获得巨大的收益。并行化完全可以做到这一点。1000个对象中的每一个都可以在任何服务器上创建。我现在利用memcache来存储阵列,但真正节省我的是前期查询和创建时间,这与循环时间相比很小。我可能已经走在了前面。我认为您需要确保的第一件事是您非常精通数据库索引。此外,还可以研究数据仓库方法,比如starschema.8200查询。它是面向对象的,所以每个基本上都实例化1000个对象,并为它们处理数据,这需要8个查询。我可以重写这一切,但这是一个批处理作业,很多时候这些对象一次使用一个。如果你正在为每个对象做一个简单的“选择*从哪里ID”查询,你可以考虑使用MeMcache来单独缓存这些行,这样你就可以在数据库之前命中MyCache。同样,这取决于您的用例,如果对象在批处理作业中一天只使用一次,并且您的缓存总是“冷的”(意味着它没有缓存元素),则不会有任何区别。同样,如果我能得到一个代码示例,我很乐意提供帮助。这正是我的“索引”所做的。迭代用于处理多个匹配项。确定。我想下一步是使用一些内存数据库。您可以在mysql或SQLite()中使用内存表。还取决于您控制了多少运行环境,因为这些方法需要的内存比共享主机提供程序通常允许的内存更多。由于分组、排序、聚合函数等原因,它可能还会简化您的代码。数据库位于AWS RDS上,也运行c1.medium。我将研究内存中的表,我不确定我以前是否听说过mysql的任何选项。您可能已经找到了以下链接: