将巨大的数组保存到数据库

时间:2013-05-09 19:09:47

标签: sql symfony

首先是简介,如果有更好的方法:我有一个带有* product_id *和 stock 的产品表,其中库存可以大到5000或者10000,我需要创建一个列表(在另一个表中),其中每个项目都有一行,如果a * propduct_id *有库存1000 我将有1000行与此* product_id *,此外,此列表必须是随机的。

我选择了一个PHP(symfony2)解决方案,因为我发现如何根据库存获得随机单个product_id,甚至如何随机订购产品列表,但我没有找到如何通过库存“乘以”这些行

现在,主要问题: 所以,在PHP中,它并不那么困难,获取product_id列表,通过库存和随机播放“倍增”,问题出现在我想要保存时:

  1. 如果我每100条记录使用$em->flush,我会在一段时间后得到内存溢出
  2. 如果我在每条记录中使用$em->flush,则需要很长时间才能保存
  3. 这是我保存的代码,也许你可以改进:

    foreach ($huge_random_list as $indice => $id_product)
    {
        $preasignacion  = new ListaPreasignacion();
        $preasignacion->setProductId($id_product);
        $preasignacion->setOrden($indice+1);
        $em->persist($preasignacion);
    
        if ($indice % 100 == 0) $em->flush();
    }
    $em->flush();
    

    使用最终解决方案进行编辑基于@Pazi建议:

    $conn = $em->getConnection();
    foreach ($huge_random_list as $indice => $id_product)
    {
       $conn->executeUpdate("insert into product_list(product_id, order) "
                                ." values({$id_product}, {$indice})");
    }
    

1 个答案:

答案 0 :(得分:3)

我建议放弃教义ORM并为此目的使用DBAL连接和纯SQL查询。我总是在我的应用程序中这样做,我必须在短时间内存储大量数据。 Doctrine在对象,检查和脱水方面增加了太多的开销。您可以通过DI容器检索DBAL连接。例如在控制器中:

conn = $this->get('database_connection');

Read more about DBAL