symfony2:命令内存不足

时间:2015-07-27 10:06:41

标签: php symfony

我正在开发一个symfony2应用程序(更具体地说,我使用的是symfony 2.7.1)。

我创建了一个命令,用于从数据库中获取信息,详细说明并将其传输到新数据库。

这或多或少是这样的:

  // init stuff
    $count = 0;

    while ( ( $res = mysqli_query($mysqli, "SELECT * FROM mytable LIMIT ".$count*100 .", ".(++$count)*100) ) && (mysqli_num_rows($res) > 0 ) )
    {

        while ($row = mysqli_fetch_assoc($res))
        {
            $my_variable_1 = new myClass1();
            $my_variable_2 = new myClass2();
            $my_variable_3 = new myClass3();

            $my_variable_1 -> setFieldA( $my_variable_2 );
            $my_variable_1 -> setFieldB( $my_variable_3 );

            $my_variable_1 -> setField01               ($row['field_01']);
            $my_variable_1 -> setField02               ($row['field_02']);
            $my_variable_1 -> setField03               ($row['field_03']);
            $my_variable_1 -> setField04               ($row['field_04']);
            $my_variable_1 -> setField05               ($row['field_05']);
            $my_variable_1 -> setField06               ($row['field_06']);
            $my_variable_1 -> setField07               ($row['field_07']);
            $my_variable_1 -> setField08               ($row['field_08']);
            $my_variable_1 -> setField09               ($row['field_09']);
            $my_variable_1 -> setField10               ($row['field_10']);

            $my_variable_3 -> setField1                ($row['field_AA']);
            $my_variable_3 -> setField2                ($row['field_BB']);

            $my_variable_2 -> setField1                ($row['field_XX']);
            $my_variable_2 -> setField2                ($row['field_YY']);

            $text = "Creating ".$my_variable_1 -> getField1() ;
            $output->writeln( $text );

              $entityManager->persist($my_variable_1);
              $entityManager->persist($my_variable_3);
              $entityManager->persist($my_variable_2);
          }

          $entityManager -> flush();

    }
  // other loops like this
事实是,我总是内存不足。 我有很多像上面那样的循环,每个循环都是10000+。 我尝试扩展允许的内存大小,但这只是推迟了问题。

是否有任何良好的做法或编码方法可以降低内存要求,或者释放未使用的内存?

提前致谢。

2 个答案:

答案 0 :(得分:5)

你的问题很可能就在这里:

.. FROM mytable LIMIT“。$ count * 100。”,“。(++ $ count)* 100)...

MySQL LIMIT子句接受两个参数。来自文档:

  

使用两个参数,第一个参数指定要返回的第一行的偏移量,第二个参数指定要返回的最大行数。初始行的偏移量为0(不是1):

在您的情况下,存在线性进展,每次迭代您选择的记录越来越多: 100,200,300,等。

将该行代码更改为:

..FROM mytable LIMIT ".$count*100 .", "100...

您只需更改偏移量,指示最大条目数的第二个参数应保持不变。 这种方式对于每次迭代,您将选择最多100条记录,并且应该解决您的内存问题。

<强>更新 另外,确保在每个循环中分离水合实体,以便GC清洁内存。

<强> 实施例

$em->detach($entity);

更多信息:http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-objects.html#detaching-entities

答案 1 :(得分:1)

您正在实体管理器中创建php对象,这些对象在持久保存到数据库后会保留在内存中。尝试使用实体管理器的clear()方法取消设置。