Повторять результаты небуферизованного запроса MySQL несколько раз

Проблема:

У меня есть запрос, который возвращает большой набор результатов. Он слишком большой, чтобы его можно было ввести в PHP. Я получаю фатальную ошибку max memory и не могу увеличить лимит памяти. Небуферизованные Запросы

Мне нужно перебирать массив несколько раз, но mysqli_data_seek не работает на небуферизованных запросах. mysqli_result:: data_seek

//I have a buffered result set
$bresult = $mysql->query("SELECT * FROM Small_Table");

//And a very large unbuffered result set
$uresult = $mysqli->query("SELECT * FROM Big_Table", MYSQLI_USE_RESULT);

//The join to combine them takes too long and is too large
//The result set returned by the unbuffered query is too large itself to store in PHP
//There are too many rows in $bresult to re-execute the query or even a subset of it for each one

foreach($bresult as &$row) {
    //My solution was to search $uresult foreach row in $bresult to get the values I need
    $row['X'] = searchResult($uresult, $row['Key']);
    //PROBLEM: After the first search, $uresult is at its and and cannot be reset with mysqli_result::data_seek
}

function searchResult($uresult, $val)
    while($row = $uresult->fetch_assoc()){
        if($row['X'] == $val) {
            return $row['X'];
        }
    }
}

Если у вас есть другое решение, удовлетворяющее этим требованиям, я приму его: - Не пытается объединить результат в одном запросе (занимает слишком много времени) - Не запускает ни одного запроса для каждого результата в другом запросе (слишком много запросов, занимает слишком много времени). долго, тормозит систему)

Пожалуйста, оставьте комментарий, если вам нужна дополнительная информация.

Спасибо.

1 ответ

Если вы пытаетесь обработать большой набор данных, вы рассматривали возможность использования такого посредника, как Hadoop? Вы можете настроить небольшой кластер hadoop, выполнить обработку, а затем сделать так, чтобы ваш php-код отправлял запрос обработанных данных на выход hadoop.

Другие вопросы по тегам