Кэширует ли CachingIterator постепенно? - PullRequest
0 голосов
/ 07 мая 2020

Я хотел бы кэшировать материал из списка, который на самом деле только должен когда-либо извлекаться один раз. Элементы в списке - это вызываемые объекты, полученные из списка файлов, и к этим файлам никогда не должно быть более одного доступа. При повторном доступе к файлу программное обеспечение нарушается.

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

Итак, поддерживает ли CachingIterator это? Или он будет кэшировать список, полученный в первой итерации, и никогда больше не go? Или он будет просто перебирать весь список, что лишает смысла использовать итераторы над массивами?

1 Ответ

0 голосов
/ 07 мая 2020

Да, CachingIterator будет добавлять элементы постепенно. В списке из 3 элементов, если в первый раз произошла одна итерация, то кеш будет содержать 1 элемент. Если в следующий раз произойдут 2 итерации, первый элемент будет извлечен из кеша, а второй - из внутреннего списка, а затем кеширован. Et c et c.

Это проиллюстрировано здесь . Обратите внимание, что в первый раз в выходном массиве один элемент, а во второй - два. Также обратите внимание на то, что первый объект - это тот же объект в обоих случаях, о чем свидетельствует номер объекта, например #1.

Кроме того, если ваши значения не являются строковыми, т. Е. Не могут быть преобразованным в строку, не забудьте удалить флаг CALL_TOSTRING по умолчанию или использовать FULL_CACHE. В противном случае вы получите ошибку. Подробнее здесь

Еще одна деталь заключается в том, что если где-то в цепочке итераторов под CachingIterator есть Генератор , то CachingIterator нельзя перемотать, а это значит, что его нельзя б / у более 1 foreach л oop. Это противоречит интуиции IMO, потому что я ожидал, что, если он кеширует, он будет перебирать кеш. Однако очевидно, что он все еще пытается перемотать внутренний итератор, который пересылает его вниз по цепочке к генератору, что в конечном итоге приводит к фатальной ошибке.

...