2013-05-09 49 views
1

首先介紹,如果有一個更好的辦法:我有一個產品表中帶* 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})"); 
} 

回答

3

我建議從學說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