Исчерпание памяти - Попытки исправить петли, все еще не работает - PullRequest
1 голос
/ 09 февраля 2011

У меня сейчас проблема с использованием памяти - но я не могу понять, где.Я попытался заменить некоторые циклы foreach на циклы for или выдать другой запрос к БД, но я все еще получаю ту же ошибку:на линии 109 ".Кто-нибудь может дать некоторое представление о том, что может быть причиной проблемы?Спасибо!

Код после ответа @Patrick:

    $participating_swimmers = array();  
    $event_standings = array();
    $qualifying_times = array();

    $events = array();

        $current_event = '';
        $select_times_sql = "SELECT event, time, name, year, team, time_standard, date_swum
                            FROM demo_times_table
                            WHERE sex = 'M' AND (time_standard = 'A' OR time_standard = 'B')
                            ORDER BY event, time ASC";
        $select_times_query = mysql_query($select_times_sql);
        //Create array with the current line's swimmer's info
        while ($swimmer_info = mysql_fetch_assoc($select_times_query)) {
            if($current_event != $swimmer_info['event']){
                $events[] = $current_event = $swimmer_info['event'];
            }

            //Create array with the current line's swimmer's info
            $swimmer_info["time"] = $select_times_row['time'];
            $swimmer_info["name"] = $select_times_row['name'];
            $swimmer_info["year"] = $select_times_row['year'];
            $swimmer_info["team"] = $select_times_row['team'];
            $swimmer_info["time_standard"] = $select_times_row['time_standard'];
            $swimmer_info["date_swum"] = $select_times_row['date_swum'];

            //Create "Top 8" list - if more than 8 A cuts, take them all
            if (($swimmer_info["time_standard"] == "A") || ($swimmer_info["time_standard"] == "B")) {               
                //Check if there are 8 or less entries in the current event, or if the swim is an A cut
                if ((count($event_standings[$current_event]) < 8) || ($swimmer_info["time_standard"] == "A")) {
                    //Add swimmer to the list of invites
                    $event_standings[$current_event][] = $swimmer_info;

                    //Keep only the identifying information about the swimmer
                    $condensed_swimmer_info["name"] = $swimmer_info["name"];
                    $condensed_swimmer_info["year"] = $swimmer_info["year"];
                    $condensed_swimmer_info["team"] = $swimmer_info["team"];

                    //Check if swimmers name already appears in list
                    if (!in_array($condensed_swimmer_info, $participating_swimmers)) {
                        //It is a unique user - add them to the list
                        $participating_swimmers[] = $condensed_swimmer_info;
                    }
                } else {
                    //Add the qualifying time that did not fit into the list to a list of qualifying times
                    $qualifying_times[$current_event][] = $swimmer_info;    
                }
            }
        }

    //Sort each array of times in descending order

    arsort($event_standings);
    arsort($qualifying_times);
    $num_of_swimmers = count($participating_swimmers);

    while ($num_of_swimmers < 80) {
foreach ($events as $loe) {
    $num_of_qualifying_times = count($qualifying_times[$loe]);
    $swimmer_info = $qualifying_times[$loe][$num_of_qualifying_times-1];
    $event_standings[$loe][] = $swimmer_info;

     //Keep only the identifying information about the swimmer
    $condensed_swimmer_info["name"] = $swimmer_info["name"];
    $condensed_swimmer_info["year"] = $swimmer_info["year"];
    $condensed_swimmer_info["team"] = $swimmer_info["team"];            
    //Check if swimmers name already appears in list
    if (!in_array($condensed_swimmer_info, $participating_swimmers)) {
        //It is a unique user - add them to the list
        $participating_swimmers[] = $condensed_swimmer_info;
    }

    //Remove time from array of qualifying times
    unset($qualifying_times[$loe][$num_of_qualifying_times-1]);
}
$new_num_of_swimmers = count($participating_swimmers);
if($num_of_swimmers == $new_num_of_swimmers) break;
else $num_of_swimmers = $new_num_of_swimmers;
    }


    arsort($event_standings);
    arsort($qualifying_times);
    foreach($event_standings as $loe => $event_swimmer) {
    echo "<h1>",$loe,"</h1><br />"; 
    foreach ($event_swimmer as $es) {
        echo $es["time"],"  ",$es["name"],"  ",$es["team"],"<br />";
    }
    }

Ответы [ 3 ]

1 голос
/ 09 февраля 2011

Большие данные в базе данных - это проблема 95%!- попробуйте использовать limit x,y в своих запросах и поместите эти запросы в какой-то цикл.- см. http://php.net/manual/en/function.mysql-free-result.php это может помочь

<?php

    $participating_swimmers = array();  
    $event_standings = array();
    $qualifying_times = array();

    $select_times_sql = "SELECT *
                        FROM demo_times_table
                        WHERE sex = 'M'
                        ORDER BY time ASC";
    $select_times_query = mysql_query($select_times_sql);
    while ($select_times_row = mysql_fetch_assoc($select_times_query)) {
        //Create array with the current line's swimmer's info
        $swimmer_info["time"] = $select_times_row['time'];
        $swimmer_info["name"] = $select_times_row['name'];
        $swimmer_info["year"] = $select_times_row['year'];
        $swimmer_info["team"] = $select_times_row['team'];
        $swimmer_info["time_standard"] = $select_times_row['time_standard'];
        $swimmer_info["date_swum"] = $select_times_row['date_swum'];

        //Create "Top 8" list - if more than 8 A cuts, take them all
        if (($swimmer_info["time_standard"] == "A") || ($swimmer_info["time_standard"] == "B")) {               
            //Check if there are 8 or less entries in the current event, or if the swim is an A cut
            if ((count($event_standings[$current_event]) < 8) || ($swimmer_info["time_standard"] == "A")) {
                //Add swimmer to the list of invites
                $event_standings[$current_event][] = $swimmer_info;

                //Keep only the identifying information about the swimmer
                $condensed_swimmer_info["name"] = $swimmer_info["name"];
                $condensed_swimmer_info["year"] = $swimmer_info["year"];
                $condensed_swimmer_info["team"] = $swimmer_info["team"];

                //Check if swimmers name already appears in list
                if (!in_array($condensed_swimmer_info, $participating_swimmers)) {
                    //It is a unique user - add them to the list
                    $participating_swimmers[] = $condensed_swimmer_info;
                }
            } else {
                //Add the qualifying time that did not fit into the list to a list of qualifying times
                $qualifying_times[$current_event][] = $swimmer_info;    
            }
        }
    }

    mysql_free_result($select_times_query);
    //Sort each array of times in descending order

    arsort($event_standings);
    arsort($qualifying_times);
    $num_of_swimmers = count($participating_swimmers);


        $sql = "SELECT DISTINCT(event)
                FROM demo_times_table
                WHERE sex = 'M' limit 80";
        $query = mysql_query($sql);
        while ($row = mysql_fetch_assoc($query)) {
            $loe = $row['event'];
            $num_of_qualifying_times = count($qualifying_times[$loe]);
            $event_standings[$loe][] = $qualifying_times[$loe][$num_of_qualifying_times-1];

             //Keep only the identifying information about the swimmer
            $condensed_swimmer_info["name"] = $qualifying_times[$loe][$num_of_qualifying_times]["name"];
            $condensed_swimmer_info["year"] = $qualifying_times[$loe][$num_of_qualifying_times]["year"];
            $condensed_swimmer_info["team"] = $qualifying_times[$loe][$num_of_qualifying_times]["team"];            
            //Check if swimmers name already appears in list
            if (!in_array($condensed_swimmer_info, $participating_swimmers)) {
                //It is a unique user - add them to the list
                $participating_swimmers[] = $condensed_swimmer_info;
            }

            //Remove time from array of qualifying times
            unset($qualifying_times[$loe][$num_of_qualifying_times-1]);
        }
        $num_of_swimmers = count($participating_swimmers);
        mysql_free_result($query);


    arsort($event_standings);
    arsort($qualifying_times);
    $sql = "SELECT DISTINCT(event)
                FROM demo_times_table
                WHERE sex = 'M'";
    $query = mysql_query($sql);
    while ($row = mysql_fetch_assoc($query)) {
        $loe = $row['event'];
            echo "<h1>".$loe."</h1><br />"; 

            foreach ($event_standings[$loe] as $es) {
                echo $es["time"]."  ".$es["name"]."  ".$es["team"]."<br />";
            }
    }

    /*
    foreach ($participating_swimmers as $ps) {
        echo $ps["name"]."<br /><br />";    
    }
    echo "<br /><br />";
*/
?>
0 голосов
/ 09 февраля 2011

Frist off, потерять SELECT DISTINCT так:

$events = array()

$current_event = '';
$select_times_sql = "SELECT event, time, name, year, team, time_standard, date_swum
                    FROM demo_times_table
                    WHERE sex = 'M' AND (time_standard = 'A' OR time_standard = 'B')
                    ORDER BY event, time ASC";
$select_times_query = mysql_query($select_times_sql);
//Create array with the current line's swimmer's info
while ($swimmer_info = mysql_fetch_assoc($select_times_query)) {
    if($current_event != swimmer_info['event']){
        $events[] = $current_event = $swimmer_info['event'];
    }
//Create "Top 8" list - if more than 8 A cuts, take them all
//Check if there are 8 or less entries in the current event, or if the swim is an A cut

Это также приводит к потере избыточного кода и может ускорить окончательный вывод (обратите внимание на запятые в операторах echo - строка не должна быть объединена перед выпуском)

foreach($event_standings as $loe => $event_swimmer) {
    echo "<h1>",$loe,"</h1><br />"; 
    foreach ($event_swimmer as $es) {
        echo $es["time"],"  ",$es["name"],"  ",$es["team"],"<br />";
    }
}

Последняя проблема заключается во втором цикле while, где информация, помещаемая в $ конденсированный_свиммер_инфо, не имеет -1, поэтому всегда пуста, а $ num_of_swimmers никогда не возрастает больше чем на 1 по сравнению с исходным значением:

while ($num_of_swimmers < 80) {
    foreach ($events as $loe) {
        $loe = $row['event'];
        $num_of_qualifying_times = count($qualifying_times[$loe]);
        $swimmer_info = $qualifying_times[$loe][$num_of_qualifying_times-1];
        $event_standings[$loe][] = $swimmer_info;

         //Keep only the identifying information about the swimmer
        $condensed_swimmer_info["name"] = $swimmer_info["name"];
        $condensed_swimmer_info["year"] = $swimmer_info["year"];
        $condensed_swimmer_info["team"] = $swimmer_info["team"];            
        //Check if swimmers name already appears in list
        if (!in_array($condensed_swimmer_info, $participating_swimmers)) {
            //It is a unique user - add them to the list
            $participating_swimmers[] = $condensed_swimmer_info;
        }

        //Remove time from array of qualifying times
        unset($qualifying_times[$loe][$num_of_qualifying_times-1]);
    }
    $new_num_of_swimmers = count($participating_swimmers);
    if($num_of_swimmers == $new_num_of_swimmers) break;
    else $num_of_swimmers = $new_num_of_swimmers;
}
0 голосов
/ 09 февраля 2011

Вместо выполнения запроса в запросе с потенциальными пробелами в логике, которые создают бесконечный цикл, вы можете сжать его в один запрос.Для вашего первого блока оба цикла просто проверяют текущее событие и пол участника, верно?Итак:

$result = SELECT * FROM <my database> WHERE sex = 'M' ORDER BY time ASC

Затем вы можете извлекать любые строки в цикле while ($ row = mysql_fetch_assoc ($ result)) и компенсировать непонятные значения другим способом.Еще один источник бесконечного цикла может быть в блоке, где вы сортируете квалифицирующее время.Вы используете «unset» после каждого, что может привести к зависанию указателя.Вы можете попробовать добавить array_values ​​($ qualifying_times) после unset, чтобы переиндексировать массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...