1

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

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

现在,主要问题:所以,在 PHP 中,获取 product_id 列表,“乘以”股票并随机播放,问题来了,当我想保存时,问题就来了:

  1. 如果我$em->flush每使用 100 条或更多记录,我会在一段时间后出现内存溢出
  2. 如果我$em->flush在每条记录中使用它需要很长时间才能保存

这是我要保存的代码,也许您可​​以改进:

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})");
}
4

1 回答 1

3

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

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

阅读有关 DBAL 的更多信息

于 2013-05-09T19:21:22.757 回答