php - кэширование памяти APC для большой переменной массива (22 МБ) - PullRequest
0 голосов
/ 18 марта 2012

У меня большой двумерный массив, который я сериализовал для сохранения в файле.Размер сериализованного файла составляет около 9,5 МБ, а чтение с диска занимает около 0,05 секунды.Для доступа к массиву процесс десериализации занимает около 1,3 секунд, что слишком долго.

Что я хочу сделать, это сначала десериализовать массив, а затем сохранить этот массив как переменную кэша APC.Я сталкиваюсь с проблемой наличия ошибки тайм-аута сервера / не найден, когда я использую apc_store или apc_add.Если я закомментирую код apc_store, то все будет хорошо, но тогда массив не будет кэширован.У меня нет проблем с кэшированием меньших тестовых файлов / массивов размером около 1 МБ.Из приведенного ниже php-кода я обнаружил, что объем памяти рассматриваемого массива составляет около 22 МБ.

Это мои настройки apc в php.ini

apc.shm_segments = 1
apc.shm_size = 512M
apc.ttl = 7200
apc.user_ttl = 7200
apc.num_files_hint = 1024
apc.enable_cli = 1
apc.max_file_size = 512M
apc.stat=1

Я тестирую свой код на локальной машине с помощью xampp.Может кто-нибудь предложить, как я могу исправить / обойти эту проблему с тайм-аутом сервера?

Вот только моя процедура тестирования кеша:

$startunser = microtime(true);

if ($quote = apc_fetch('serialfile')) {

        echo "<br> serfile [cached] ";
} 
else {

    $start_memory = memory_get_usage();
    $sF = "seri.txt";
    $sxx = file_get_contents($sF);
    $pro = unserialize($sxx);
    apc_store('serfile', $pro, 10);

    echo "<br>serfile is NOT cached ";
    echo memory_get_usage() - $start_memory;
}

$elapsedunser = microtime(true) - $startunser;
echo "<p>The unserialize process took $elapsedunser seconds";

return;

Также в качестве интересного примечания для любопытства любого человека,когда я вспоминаю (используя apc_fetch) массив из APC, который не был сериализован из сериализованного файла размером приблизительно 1 МБ, процесс выборки фактически был дольше, чем просто чтение файла с диска и десериализация файла (.5 против .4 секунды).Сначала я тоже не поверил.

TIA

1 Ответ

0 голосов
/ 23 апреля 2012

APC не очень подходит для хранения таких больших данных.Вы пытались сериализовать данные в виде PHP-кода (например, используя var_dump ) и записать их в виде файла .php для включения в него?Это все еще может быть слишком большим, чтобы справиться с этим.

...