2014-01-13 3 views
0

У меня есть таблица с около 100000 записей, структура показана нижеОптимизация управления памятью для PHP и MySQL

id | name | desc | length | breadth | -------------|remark //upt o 56 fields 
1  FRT-100 -desc-  10  10      remarking 
---------------------------------------------------------------- 
---------------------------------------------------------------- 

, что РМКО делает это с помощью cronjob (Gearman), чтобы записать все эти данные в CSV мой код приведен ниже

 <?php 
     set_time_limit (0); 
    ini_set("memory_limit","2048M"); 
     //get the total count of records,so that we can loop it in small chunks 
     $query = "SELECT COUNT(*) AS cnt FROM tablename WHERE company_id = $companyid"; 

      $result = $link->query($query); 
      $count = 0; 
      while ($row = mysqli_fetch_array($result)) { 
       $count = $row["cnt"]; 
      } 
      if ($count > 1000) { 
       $loop = ceil($count/1000); 
      } else { 
       $loop = 1; 
      } 


     // im going to write it in small chunks of 1000's each time to avoid time out 

      for ($ii = 1; $ii <= $loop; $ii++) { 

       if ($ii == 1) { 
        $s = 1; 
       } else { 
        $s = floatval(($ii * 1000) - 1000); 
       } 

       $q = "SELECT * FROM datas WHERE group_company_id = $companyid LIMIT 1000 OFFSET $s"; 
       $r = $link->query($q);  

     while ($row2 = mysqli_fetch_array($r)) { 
        //my csv writing will be done here and its working fine for records up to 10,000 ~ 12,000 after than memory exhaustion occours 
     } 
} 
    ?> 

я сильно подозреваю, что-то может быть оптимизировано в зависимости смещения от MySQL .can кто-то показать мне лучший способ оптимизировать его? открыт для любых предложений (CRON, сторонние библиотеки ..etc)

+0

'while ($ row = mysqli_fetch_array ($ result)) {' --- зачем вам нужен цикл здесь? – zerkms

+0

@zerkms, чтобы узнать, сколько записей ... с его одной строки. Да, вы правы. – coolguy

+0

@zerkms вы можете поместить некоторый свет на лимит, проблема смещения – coolguy

ответ

2

Попробуйте и не храните все в памяти сразу, вместо этого загружайте каждую строку, а затем выпишите результат по одной строке за раз.

<?php 
$q = "SELECT * FROM datas"; 
$r = $link->query($q);  
$fp = fopen("out.csv","w+"); 
// Or you could just set the headers for content type, and echo the output 
while ($row2 = mysqli_fetch_array($r)) { 
    fwrite($fp, implode(",",$row2)."\n"); 
} 
fclose($fp); 

Это должно решить проблему, ничего не сохраняется в памяти.

+0

Спасибо, что попробуй, что – coolguy

Смежные вопросы