gpt4 book ai didi

php - 优化 PHP 代码以从大型数据集构建树结构

转载 作者:行者123 更新时间:2023-11-29 20:22:54 25 4
gpt4 key购买 nike

我有一个程序来填充最高级别的节点或父节点,以填充到每个子节点和孙节点旁边。

我首先创建了一个树结构,然后解析以填充每个子/孙节点旁边的最高级别节点或根节点。

但是当我在大于 20000 行的大型数据集上运行程序时,我收到此错误:

Fatal error:  Out of memory (allocated 1807745024) (tried to allocate 36 bytes) in C:\xampp\htdocs\test_project\index.php on line 20

这是我的代码:

<?php

include('mysql_config.php');

set_time_limit(0);
ini_set('memory_limit', '2048M');
$r = mysql_query("SELECT Emp_ID AS id,fname AS name,Manager_ID AS parent_id FROM targets");
$data = array();
while($row = mysql_fetch_assoc($r)) {
$data[] = $row;
}
$j = mysql_query("SELECT Emp_ID AS id,fname AS name,Manager_ID AS parent_id FROM targets where Type = 'Super Manager'");
$parent_data = array();
while($row = mysql_fetch_assoc($j)) {
$parent_data[] = $row;
}

function buildtree($src_arr, $parent_id = 0, $tree = array())
{
foreach($src_arr as $idx => $row)
{
if($row['parent_id'] == $parent_id)
{
foreach($row as $k => $v)
$tree[$row['id']][$k] = $v;
unset($src_arr[$idx]);
$tree[$row['id']]['children'] = buildtree($src_arr, $row['id']);
}
}
ksort($tree);
return $tree;
}

function fetch_recursive($tree, $parent_id, $parentfound = false, $list = array())
{
foreach($tree as $k => $v)
{
if($parentfound || $k == $parent_id)
{
$rowdata = array();
foreach($v as $field => $value)
if($field != 'children')
$rowdata[$field] = $value;
$list[] = $rowdata;
if($v['children'])
$list = array_merge($list, fetch_recursive($v['children'], $parent_id, true));
}
elseif($v['children'])
$list = array_merge($list, fetch_recursive($v['children'], $parent_id));
}
return $list;
}
foreach($parent_data as $value)
{
echo '<pre>';
$result_data = fetch_recursive(buildtree($data),(int)$value['id']);
print_r($result_data);
echo '</pre>';
if(!empty($result_data)){
foreach($result_data as $child_val){
$su_id=(int)$value['id'];
$name_man=(string)$value['name'];
$dest_id=$child_val['id'];
mysql_query("update targets set SM_ID ='$su_id',SM_Name='$name_man' where Emp_ID='$dest_id'") or die (mysql_error());
}
}
}

?>

如何优化代码来解决此错误。我用 100 行尝试了这段代码,效果很好。

原始问题陈述

我的数据库中有以下数据:

Manager_ID Employee_ID

AAA BBB
AAA CCC
AAA DDD
BBB EEE
BBB FFF
CCC GGG
FFF HHH
III JJJ
JJJ KKK
JJJ LLL

我希望用各自的最高级别根节点填充子节点,以便所有子节点都有一个映射到它们的根级别数据/父节点,如下所示:

Employee_ID 1st Level Node
AAA Root
BBB AAA
CCC AAA
DDD AAA
EEE AAA
FFF AAA
GGG AAA
HHH AAA
III Root
JJJ III
KKK III
LLL III

我尝试创建一个 PHP 函数来创建一棵树,但无法从那里将它填充到相应子节点的最后或最高级别的根。

最佳答案

经验法则:PHP 对于每个标量值有 40 字节的开销。这加起来很快。

不要使用已弃用的mysql_*接口(interface);使用 mysqli_*PDO

问题的解决方案:将所有数据放入MySQL临时表中,然后使用SQL语句重新排列成分层格式。啊;您似乎已经在表中包含了数据。

SQL 将涉及层次结构的每个级别一个 SQL 语句,可能会在单个语句中执行该级别的所有记录。 PHP 代码将控制级别,因为 MySQL 没有层次结构的概念。

很可能此更改甚至会比 PHP 运行得更快 - 最终您会得到少量查询,而不是当前设计的 20000 个(或更多)查询。

这是一种转换代码的方法。从最里面的 for 循环开始。考虑一下如何将该循环转换为一个 SQL 语句。然后就去做吧。 (这一步之后你可能会很高兴。)

关于php - 优化 PHP 代码以从大型数据集构建树结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39448243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com