2011-10-10 11 views
2

MySQLデータベースのデータを使用してExcelExcelを使用してExcelドキュメントを作成しています。私のスクリプトは、RAM、512MBの下で実行する必要があり、そして私の輸出は20万件のレコードを達するように私はトラブルに実行している:私は可能なRAMのように少しの量で大きな文書を作成するためにPHPExcelを使用するにはどうすればよい大きな行をExcelドキュメントに小さなメモリフットプリントでエクスポートする

PHP Fatal error: Allowed memory size of...

を?

私の現在のコード:

  // Autoload classes 
    ProjectConfiguration::registerPHPExcel(); 


    $xls = new PHPExcel(); 
    $xls->setActiveSheetIndex(0); 


    $i = 0; 
    $j = 2; 
      // Write the col names 
    foreach ($columnas_excel as $columna) { 
     $xls->getActiveSheet()->setCellValueByColumnAndRow($i,1,$columna); 
     $xls->getActiveSheet()->getColumnDimensionByColumn($i)->setAutoSize(true); 
     $i++; 
    } 


    // paginate the result from database 
    $pager = new sfPropelPager('Antecedentes',50); 
    $pager->setCriteria($query_personas); 
    $pager->init(); 
    $last_page = $pager->getLastPage(); 

    //write the data to excel object 
    for($pagina =1; $pagina <= $last_page; $pagina++) { 
     $pager->setPage($pagina); 
     $pager->init(); 
     foreach ($pager->getResults() as $persona) { 
      $i = 0; 
      foreach ($columnas_excel as $key_col => $columnas) { 
       $xls->getActiveSheet()->setCellValueByColumnAndRow($i,$j,$persona->getByName($key_col, BasePeer::TYPE_PHPNAME)); 
       $i++; 
      } 
      $j++; 
     } 
    } 

    // write the file to the disk 
    $writer = new PHPExcel_Writer_Excel2007($xls); 
    $filename = sfConfig::get('sf_upload_dir') . DIRECTORY_SEPARATOR . "$cache.listado_personas.xlsx"; 
    if (file_exists($filename)) { 
     unlink($filename); 
    } 
    $writer->save($filename); 

CSVバージョン:Propelのは、データベースへのリクエストを行う際に

// Write the col names to the file 
$columnas_key = array_keys($columnas_excel); 
file_put_contents($filename, implode(",", $columnas_excel) . "\n"); 

//write data to the file 
for($pagina =1; $pagina <= $last_page; $pagina++) {      
     $pager->setPage($pagina); 
     $pager->init(); 
     foreach ($pager->getResults() as $persona) { 
      $persona_arr = array(); 
      // make an array   
      foreach ($columnas_excel as $key_col => $columnas) { 
       $persona_arr[] = $persona->getByName($key_col, BasePeer::TYPE_PHPNAME);     
      } 
      // append to the file 
      file_put_contents($filename, implode(",", $persona_arr) . "\n", FILE_APPEND | LOCK_EX);    
     } 
    } 

はまだRAMの問題を抱えている、それはPropelのようなものですあなたが新しい要求をするたびにRAMを解放しません。各繰り返しでページャオブジェクトを作成して削除しようとしました。

+0

あなたはもっと説明できますか? –

+0

代わりにCSVを作成すると考えましたか?そうすれば、ファイルに書き込むことができますか? – Brad

+0

私はCSVへのエクスポートのためのchagesを作成し、同様の問題があります – rkmax

答えて

0

CSVを使用できるように見えるので、一度に1レコードを取り出してCSVに追加してみてください。同時に200kのレコードをすべて取得しようとしないでください。

$cursor = mysql_query($sqlToFetchData); // get a MySql resource for your query 
$fileHandle = fopen('data.csv', 'a');  // use 'a' for Append mode 

while($row = mysql_fetch_row($cursor)){ // pull your data 1 record at a time 
    fputcsv($fileHandle, $row);   // append the record to the CSV file 
} 

fclose($fileHandle);      // clean up 
mysql_close($cursor); 

CSVをXLSファイルに変換する方法がわかりませんが、うまくいけば、これであなたを手に入れてくれます。 PropelはクエリAPIでformattersを持っている、あなたはこの種のコードを書くことができるようになります

1

<?php 
$query = AntecedentesQuery::create() 
      // Some ->filter() 
      ; 
$csv = $query->toCSV(); 

$csvはyou'lが正しいMIMEタイプを設定することにより、レンダリングすることができCSVの内容が含まれています。

+0

ありがとう、それを知って良い – rkmax

関連する問題