保存庞大的阵列到数据库

问题描述:

首先介绍,如果有一个更好的办法:我有一个产品表中带* PRODUCT_ID *和股票,其中股票可以大到5000或10000,我需要创建一个列表(在另一个表中),我有一个行的每个项目,这是,如果* propduct_id *有股票1000我将有1000行这个* product_id *,加上,这个列表需要是随机。保存庞大的阵列到数据库

我选择了PHP(Symfony2的)解决方案,因为我发现了如何基于股票甚至如何随机顺序的产品列表,随机获得一个单一的product_id,但我没有找到如何通过“正片叠底”这一行股票。

现在,主要问题: 因此,在PHP中它是没有那么困难,得到的product_id名单,“正片叠底”的股市和洗牌,问题是当我想要保存:

  1. 如果我用$em->flush每100个记录或更多我得到一个内存溢出而
  2. 后,如果我使用$em->flush在每次需要年龄记录,以节约

这是我的代码为s AVE这也许可以提高:

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

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

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

Read more about DBAL

+0

是的,速度更快!在15秒内做了10.000条记录 – 2013-05-09 19:28:49

+0

@ K.Weber,原始代码的性能如何?只是好奇。 – 2013-05-09 19:36:50