Когда я делал запрос к базе данных и извлекал результаты в mysqli_result, использование памяти крайне мало. Однако, когда я получаю все строки в результатах запроса в ассоциативный массив, использование памяти становится чрезвычайно высоким.
<?php require_once("../config.php"); //db connection config $db = new mysqli(DB_HOST,DB_USER,DB_PASSWORD,DB_DBASE); $query ="select * from table_name"; if($r = $db->query($query)){ echo "MEMORY USAGE before : ". memory_get_usage()."<br><br>"; $rows = array(); while($row = $r->fetch_assoc()){ $rows[]= $row; } echo "MEMORY USAGE after : ". memory_get_usage()."<br><br>"; //before: 660880 //after: 114655768 // # of records: around 30 thousands ?>
Для меня имеет смысл, что для хранения этих многих результатов очень много памяти, но мне просто интересно, почему mysqli_result настолько мала. Не может быть, чтобы результаты были запрошены к dbase каждый раз, когда вызывается fetch_assoc. Итак, где же результаты сохраняются в памяти.
Существует огромная разница между получением результатов и сохранением указателя на ресурс.
Если вы echo $r;
перед первым вызовом memory_get_usage();
, вы поймете, что это всего лишь указатель. Это указатель на ваш результирующий набор. Пока вы не получите результаты, набор результатов фактически не будет сохранен в памяти.
Я предлагаю вам запустить fetchAll()
за то, что вы пытаетесь сделать. Это приведет к тому, что 1 метод получит доступ ко всем вашим результатам с лучшей производительностью, поскольку он заложен на расширении mysqli (C Library), а не в петле на PHP.
Вы также можете использовать функцию бесплатных результатов, чтобы очистить свои результаты от памяти, когда вы закончите с ними. Это похоже на закрытие курсора на Java, если вы знакомы.
Я думаю, вы должны это сделать:
while($row = $r->fetch_assoc()){ //Do whatever you need with the record, then: unset($row); }
сwhile($row = $r->fetch_assoc()){ //Do whatever you need with the record, then: unset($row); }
То, как вы размещаете, собирает огромный массив в $rows
, и использование памяти отражает это.