Представьте, что у вас есть следующий массив целых чисел:
array(1, 2, 1, 0, 0, 1, 2, 4, 3, 2, [...] );
Целые числа идут до одного миллиона записей; только вместо жесткого кодирования они были предварительно сгенерированы и сохранены в форматированном файле JSON (размером приблизительно 2 МБ). Порядок этих целых чисел имеет значение, я не могу случайным образом генерировать его каждый раз, потому что он должен быть последовательным и всегда иметь одинаковые значения в тех же индексах.
Если этот файл снова читается на PHP (например, используя file_get_contents
+ json_decode
), он принимает от 700 до 900 мс только для того, чтобы вернуть массив - "Хорошо", - подумал я, "вероятно, разумно, поскольку json_decode
должен разбирать около 2 миллионов символов, пусть кэширует его". APC кэширует его в записи, которая занимает около 68 МБ, возможно, нормальная, zvals большие. Извлечение, однако, этот массив обратно с APC также занимает около 600 мс, что слишком сильно в моих глазах.
Изменить: APC выполняет сериализацию /unserialize для хранения и извлечения контента, который с миллионом массива элементов является длительным и тяжелым процессом.
Итак, вопросы:
-
Должен ли я ожидать эту задержку, если я намереваюсь загрузить миллионный массив записей, независимо от хранилища данных или метода, в PHP? Насколько я понимаю, APC хранит сам zval, поэтому теоретически получение его из APC должно быть таким же быстрым, как возможно (без синтаксического анализа, без преобразования и без доступа к диску) -
Почему APC настолько медленна для чего-то настолько простого? -
Есть ли эффективный способ загрузить миллион записей массива, полностью в памяти с помощью PHP? предполагая, что использование ОЗУ не является проблемой.
-
Если бы мне приходилось обращаться к только срезам этого массива на основе индексов (например, загружать кусок из индекса 15 в индекс 76) и никогда не иметь весь массив в памяти (да, я понимаю, что это разумный способ делать это, но я хотел знать все стороны), что было бы самой эффективной системой хранения данных для полного массива? Очевидно, что не RDBM; Я думаю redis, но я был бы рад услышать другие идеи.