За последние 24 часа нас посетили 17864 программиста и 1719 роботов. Сейчас ищут 904 программиста ...

mmap() failed

Тема в разделе "PHP для новичков", создана пользователем satex, 15 фев 2023.

  1. satex

    satex Новичок

    С нами с:
    15 фев 2023
    Сообщения:
    10
    Симпатии:
    0
    >./yii difference/json
    mmap() failed: [12] Cannot allocate memory
    mmap() failed: [12] Cannot allocate memory
    PHP Fatal error: Out of memory (allocated 4194304) (tried to allocate 2950070488 bytes) in /var/www/html/yii/console/models/Difference.php on line 112
    Fatal error: Out of memory (allocated 4194304) (tried to allocate 2950070488 bytes) in /var/www/html/yii/console/models/Difference.php on line 112
    PHP Fatal Error 'yii\base\ErrorException' with message 'Out of memory (allocated 4194304) (tried to allocate 2950070488 bytes)'
    in /var/www/html/yii/console/models/Difference.php:112
    Stack trace:
    #0 [internal function]: yii\base\ErrorHandler->handleFatalError()
    #1 {main}
    total 312K
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    В конфигах пыха стоит ограничение на память, надо увеличить. Или переписать то, что ты там пытаешься делать, так, чтоб не жрало столько памяти. Обычно для консоли ограничение на память не ставят. Где валяются конфиги - зависит от ОС.
     
  3. satex

    satex Новичок

    С нами с:
    15 фев 2023
    Сообщения:
    10
    Симпатии:
    0
    везде стоит memory_limit = -1
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    А чего ты там такое пилишь, чему нужно 2.7 гига памяти? И сколько памяти на машине, где это исполняется?
    --- Добавлено ---
    Если у тебя точно -1, получается, ОС отказала пыхе в выделении такого кол-ва памяти
     
  5. satex

    satex Новичок

    С нами с:
    15 фев 2023
    Сообщения:
    10
    Симпатии:
    0
    В прошлый раз такого вообще не было.
    PHP:
    1.     public function getJson($value = false)
    2.     {
    3.         $content = file_get_contents($this -> file);
    4.         $array = json_decode($content);
    5.         $allFields = [];
    6.         foreach ($array as $item) {
    7.             $this -> fields = [];
    8.             echo '.';
    9.             $allFields[] = $this -> allFields($item, $value);
    10.         }
    11.         return $allFields;
    12.     }
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    А откель JSON? Какой у него объём, и чего там внутрях?
     
  7. satex

    satex Новичок

    С нами с:
    15 фев 2023
    Сообщения:
    10
    Симпатии:
    0
    JSON на 2 гига, массив.
    Дело не в этом, дело в том, что я первый раз когда писал, то всё работало.
    А как mmap грузится, оно от рождения там?
     
  8. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    Именно в этом, мб в прошлый раз файл поменьше был, а может в этот раз у тебя ещё какие то доп проги запущены, которые память отьедают
     
  9. satex

    satex Новичок

    С нами с:
    15 фев 2023
    Сообщения:
    10
    Симпатии:
    0
    ¯\_(ツ)_/¯
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Это сишная линуксовая функция для мапинга файла в память. Пыха на сишке написана. Ну значит где-то внутрях пыховых функций, которые ты используешь, она используется.
     
  11. satex

    satex Новичок

    С нами с:
    15 фев 2023
    Сообщения:
    10
    Симпатии:
    0
    А где она настраивается?
     
  12. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Нигде. Это уже кишки пыхи.
     
  13. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    извините за некропостинг. просто решил посмотреть в историю пользователя, не совсем ли он бот )))

    Не для ТС но по теме: очевидно какие бы ни были настройки, всегда найдётся файл, который тупо превысит возможности данной конфигурации если ты решаешь проблему в лоб "брутфорсом". Поэтому надо разбираться а что за данные и нельзя ли их обрабатывать как поток записей. Если это JSON lines, то конечно можно устроить цикл обработки.
    --- Добавлено ---
    Пример кода выше как бы намекает, что да, там массив записей. И если записи разделены "\n", можно заменить file_get_contents() на цикл с fgets(). А json_decode() применять к каждой записи в цикле. Да, будет помедленнее, но будет справляться с любыми объёмами без креша!

    P.S. Конечно накопливать дуодециллион записей в массиве так себе идея. Можно решить генераторами (imho красивое решение), а можно просто саму функцию убрать, а чтение-разбор строк унести туда, где они используются. Ты же где-то крутишь этот массив в цикле, да? ))