Насколько большой может быть массив php до проблем с памятью?

В настоящее время наше приложение работает следующим образом:

class myClass{

    private $names = array();

    function getNames($ids = array()){
         $lookup = array();

         foreach($ids as $id)
             if (!isset($this->names[$id]))
                $lookup[] = $id;

         if(!empty($lookup)){
              $result;//query database for names where id in $lookup
                      // now contains associative array of id => name pairs
              $this->names = array_merge($this->names, $result);
         }

         $result = array();
         foreach($ids as $id)
             $result[$id] = $this->names[$id];

         return $result;
    }
}

Что работает отлично, за исключением того, что он все еще (и часто делает) приводит к нескольким запросам (в этом случае 400 и более).

Итак, я думаю просто запросить базу данных и заполнить массив $this->names каждым именем из базы данных.

Но меня беспокоит, сколько записей в базе данных я должен начать беспокоиться о памяти при этом? (столбец базы данных - varchar (100))

Ответ 1

Сколько у вас памяти? И сколько одновременных пользователей обычно поддерживает ваш сервис во время пикового доступа? Это соответствующие сведения. Без них любой ответ бесполезен. Как правило, это вопрос, легко решаемый при нагрузочном тестировании. Затем найдите узкие места и оптимизируйте их. До тех пор просто заставьте его работать (в пределах разумного).

Но...

Если вам действительно нужна идея того, что вы ищете...

Если мы предположим, что вы не храните многобайтовые символы, у вас есть 400 имен * 100 символов (предположим, что каждое имя максимизирует ваш предел char)... вы смотрите ~ 40 Кб памяти. Кажется слишком незначительным, чтобы беспокоиться, не так ли?

Очевидно, вы получите другие накладные расходы от PHP, чтобы сохранить сам файл данных. Не могли бы вы более эффективно хранить вещи, используя структуру данных, например SplFixedArray вместо простой array? Вероятно, но тогда вы теряете оптимизированные функции array_*, которые вам в противном случае пришлось бы манипулировать списком.

Будет ли пользователь использовать каждую из записей, которые вы планируете хранить в памяти? Если у вас есть их для вашего приложения, не имеет значения, насколько они велики, не так ли? Не стоит хранить много информации, которая вам не нужна в памяти "только потому, что". Одна вещь, которую вы определенно не хотите делать, - это запросить базу данных для 4000 записей при каждой загрузке страницы. По крайней мере, вам нужно будет поместить эти типы транзакций в хранилище памяти, например memcached, или использовать APC.

Этот вопрос, как и большинство вопросов в области информатики, - это просто ограниченная проблема максимизации. Он не может быть правильно решен, если вы не знаете переменные в вашем распоряжении.

Ответ 2

Как только вы получите более тысячи элементов, или так подставленные поисковые запросы начинают очень медленно (при доступе к определенному ключу есть задержка). Вы можете исправить это с помощью ksort(). (Я видел, что script переходите от 15 минут работы до менее 2 минут, просто добавив ksort)

Другое, что вы действительно ограничены только памятью.

Лучше всего было бы построить массив отсутствующих данных в вашем script, а затем получить их все в одном запросе, используя список IN.

Вам действительно не следует тратить память на хранение данных, которые пользователь никогда не увидит, если вы сможете помочь.