更快地搜索和更改大型关联数组中的数据

时间:2016-04-11 14:12:11

标签: php arrays

我有一个非常大的关联数组(~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。

0 个答案:

没有答案