PHP и ребенок с миллионным массивом

Представьте, что у вас есть следующий массив целых чисел:

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 выполняет сериализацию/десериализацию для хранения и извлечения контента, что с массивом из миллиона элементов является длительным и трудоемким процессом.

Итак, вопросы:

  • Следует ли мне ожидать такой задержки, если я намереваюсь загрузить в PHP массив из миллиона записей, независимо от хранилища данных или метода? Насколько я понимаю, APC хранит сам zval, поэтому теоретически получение его из APC должно быть максимально быстрым (без синтаксического анализа, без преобразования, без доступа к диску)

  • Почему APC такой медленный для чего-то такого, казалось бы, простого?

  • Есть ли какой-нибудь эффективный способ полностью загрузить массив из миллиона записей в память с помощью PHP? предполагая, что использование оперативной памяти не является проблемой.

  • Если бы мне нужно было получить доступ только к фрагментам этого массива на основе индексов (, например. загрузка чанка с индекса 15 на индекс 76 )и никогда на самом деле весь массив в памяти (да, я понимаю, что это разумный способ сделать это, но я хотел знать все стороны ), что была бы наиболее эффективной системой хранения данных для всего массива? Очевидно, что это не RDBM; Я думаю редис,но я был бы рад услышать другие идеи.

11
задан Community 22 September 2017 в 17:44
поделиться