PHP массив включает производительность - PullRequest
1 голос
/ 04 мая 2010

Какой тип снижения производительности можно ожидать, если я включу огромный массив PHP?Например, допустим, у меня есть PHP-массив размером 1 ГБ в «data.php», который выглядит как

$ data = array (// 1 ГБ данных)

Если я включу этот огромный "data.php "file on" header.php ", как это повлияет на производительность" header.php "при его запуске?Спасибо!

Ответы [ 5 ]

5 голосов
/ 04 мая 2010

Во-первых, вам нужно увеличить максимальный объем памяти для ваших страниц до более чем гигабайта, потому что этот массив будет загружен в память на каждой странице . Это означает, что для каждого сценария необходимо прочитать и проанализировать 1 ГБ данных. Лучший случай? Это добавляет 10+ секунд к каждой загрузке страницы. Скорее всего, страница вообще не будет загружаться.

Храните его в базе данных и запрашивайте по мере необходимости. Я не могу представить сценарий, в котором вам понадобится весь этот массив (или значительная его часть) этого массива на каждой (или фактически любой) странице.

3 голосов
/ 04 мая 2010

Хм ... Много?

data.php будет огромным, поэтому чтение файла займет много времени из-за дискового ввода-вывода. Тогда он должен оставаться в памяти, поэтому даже если у вас нет ограничений памяти, это повлияет на производительность.

Еще одним узким местом является ограничение max_execution_time. Скорее всего, вы делаете что-то не так, если вам требуется 1 ГБ данных в памяти ... Рассматривали ли вы хранение необработанных (дополненных) данных, по одному элементу на каждую строку, а затем просто запросите некоторые конкретные байты этого файла?


Пример (запись):

$values = array
(
    0 => '127.0.0.1', // 9 chars
    1 => '127.0.0.2', // 9 chars
    2 => '...', // 3 chars
    3 => '255.255.255.255', // 15 chars - this is the max in our set
);

foreach ($values as $key => $value)
{
    // lets pad each value to 15 bytes
    $values[$key] = str_pad($value, 15, ' ', STR_PAD_LEFT);
}

file_put_contents('./test.data', implode('', $values), LOCK_EX);

Пример (чтение):

echo ltrim(file_get_contents('./test.data', false, null, 0 * 15, 15)); // 127.0.0.1
echo '<hr />';
echo ltrim(file_get_contents('./test.data', false, null, 1 * 15, 15)); // 127.0.0.2
echo '<hr />';
echo ltrim(file_get_contents('./test.data', false, null, 2 * 15, 15)); // ...
echo '<hr />';
echo ltrim(file_get_contents('./test.data', false, null, 3 * 15, 15)); // 255.255.255.255
1 голос
/ 08 мая 2010

Просто выстрел в темноте, но, учитывая, что вы не можете использовать memcached и т. Д. Рассматривали ли вы использование дискового кэша, либо напишите свой собственный класс. Поэтому, где бы вы использовали memcached-> storeValue (или какой-либо другой вызов), вы бы вместо этого вызывали свою собственную функцию, которая записывала бы данные в файл. Сложности этого, вероятно, выходят за рамки этого вопроса. Другой альтернативой может быть использование чего-то уже написанного, такого как Zend Framework и его различные классы кэширования, которые должны позволять кэширование на диске. Другие платформы, вероятно, имеют свои собственные системы кэширования, которые могут записывать на диск (codeIgniter, CakePHP и т. Д.). Третьим вариантом может быть кеширование сгенерированных данных в базу данных mysql, хотя это может показаться немного сумасшедшим, если все сделано правильно, это все равно даст вам повышение скорости примерно так же, как и любое другое кеширование. При кэшировании стоит потратить немало времени на сравнительный анализ, чтобы убедиться, что вы действительно устраняете узкое место, делая это.

0 голосов
/ 04 мая 2010

Если вы храните 1 ГБ данных на data.php, то анализ файла 1 ГБ занимает много времени, а затем помещает данные массива в память, занимает время и пространство. Сервер обрабатывает несколько запросов одновременно, что составляет 1 ГБ на 100–1000 от общего объема памяти в зависимости от ежедневного просмотра вашего сайта.

Почему бы не попробовать разбить его на несколько файлов или использовать базу данных? Или даже создайте фоновый сервис, который имеет жестко закодированные данные объемом 1 ГБ в C, и PHP вызывает сервис для извлечения частей данных.

0 голосов
/ 04 мая 2010

Зависит от вашего сервера, процессора, оперативной памяти, веб-сервера, жестких дисков и т. Д.

Но, скорее всего, это не очень хорошая идея. было бы намного лучше прочитать файл, используя fread или что-то еще.

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