我有一个非常大的关联数组(~5.000.000元素),具有相似的结构:
$largeArray = array(
'1' => array(
'type' => char(1),
'o_id' => int(11),
'p_id' => int(11),
'parent' => int(11),
'linked' => int(11),
'name' => string,
'alternate' => string(long),
'extratags' => string(in hcode format),
'deep' => int(1),
'children' => int(7),
'fcode' => char(3)
),
....
)
注意: $ largeArray中的键不是逐个递增的,它们都是一个11字节长的唯一int。
我想解析这个数组,并检查每个子数组linked
属性是否为0。如果它不为0,则表示它指向另一个$largeArray
的子数组,并带有相应的键。如果是这种情况,则必须合并两个数据(现在无关紧要,它们如何合并),以便从数组中删除其中一个键。链接只是一种方式,所以例如如果A链接到B,B没有链接回A.可能B也链接到C,因此合并操作是递归完成的,如下所示:
mergeTwoIds($id1, $id2) {
if ($largeArray[$id2]['linked'] != 0) mergeTwoIds($id2, $largeArray[$id2]['linked']);
}
当两个数组合并时,如果后来删除的数组的children
属性不为0,我必须将每个其他子数组更改为parent
后面删除的数组,一个新的价值。为此,我现在浏览整个数组,检查每个parent
属性,如果我在其中找到了已删除的子数组id,我就更改它。这很慢。我不确切知道数据集中有多少链接的子数组,但是为了每次合并都要执行此操作,执行时需要大约30秒。我运行的脚本执行此操作,在5480秒内解析了大约40000个孩子,并估计在完成之前还有另外575707秒。这是一个非常粗略的估计,因为我不知道链接儿童的确切数量,因此我无法准确计算。
是否有更快的方法来达到预期的效果? (更改具有特定parent
值的每个元素的parent
注意2:这是一次运行脚本,我正在处理的服务器的内存完全专用于此操作,服务器有36GB RAM,允许PHP使用增加26GB。