Уменьшит ли использование memcache память моего экземпляра?

В настоящее время я сталкиваюсь с программными ошибками памяти в своем приложении Google App Engine из-за большого использования памяти. Ряд больших объектов увеличивает использование памяти до небес.

Я подумал, что, возможно, если бы я установил и отозвал их из кэша памяти, это могло бы уменьшить общее использование памяти. Читая документы, это не так, и что преимущество memcache заключается в сокращении запросов HRD.

Влияет ли memcache на общую память положительно или отрицательно?

Редактировать: я знаю, что могу обновить класс экземпляра до F2, но я пытаюсь понять, смогу ли я оставаться на наименее дорогом при уменьшении памяти.


person user1961    schedule 22.04.2015    source источник


Ответы (1)


Перемещение объектов в Memcache и из него не повлияет на вашу память, если только вы не уничтожите эти объекты в своем Java-коде или пустых коллекциях.

Более серьезная проблема заключается в том, что объекты memcache ограничены 1 МБ, а наличие memcache не гарантируется. Первое из этих ограничений означает, что вы не можете помещать очень большие объекты в Memcache.

Второе ограничение означает, что вы не можете легко заменить, например, HashMap на memcache — невозможно сказать, возвращает ли getValue() значение null из-за отсутствия объекта или из-за того, что он был удален из memcache. Таким образом, вам придется каждый раз делать дополнительный вызов к хранилищу данных, чтобы убедиться, что объект действительно отсутствует.

person Andrei Volgin    schedule 22.04.2015
comment
В целом это правда, я вижу случаи, когда memcache может помочь. Если код использует много памяти для вычисления небольшого результата, возможно, результат можно кэшировать, что снижает потребность в его вычислении и уменьшает использование памяти. Если бы вопрос был менее расплывчатым в отношении сценария, было бы легче предложить альтернативы. - person Zig Mandel; 22.04.2015
comment
Я не уверен, как кэширование небольшого объекта (результата) уменьшит использование памяти. Как правило, вам нужно много памяти, когда вам нужно прочитать много данных в память, и вы не можете отбросить их до самого конца. Я согласен, однако, что есть много способов уменьшить использование памяти, особенно если задействованы циклы и коллекции. - person Andrei Volgin; 22.04.2015
comment
Спасибо обоим. Мой сценарий: у меня есть много запросов на чтение одного и того же блоба без его изменения. Загрузка его снова и снова по многим запросам, кажется, увеличивает использование памяти более чем на 128 МБ. - person user1961; 23.04.2015
comment
Re andrei, потому что вы экономите на пересчете значения из источника, который может интенсивно использовать память. Вместо этого OP следует рассмотреть возможность сохранения объектов в глобальной памяти (с надлежащим учетом параллельных запросов к одному и тому же экземпляру), если у вас много одновременных запросов и вы создаете их копии. - person Zig Mandel; 23.04.2015
comment
Похоже, в вашей реализации есть утечка памяти. Многократная загрузка одного и того же большого двоичного объекта не должна влиять на вашу память сверх максимального количества параллельных запросов, и использование Memcache, скорее всего, поможет в вашем сценарии — не с памятью, а для ускорения времени отклика. Убедитесь, что вы закрываете средства чтения при чтении большого двоичного объекта, и рассмотрите возможность использования глобальной статической переменной, чтобы убедиться, что у вас есть только одна копия в памяти экземпляра. - person Andrei Volgin; 23.04.2015
comment
Спасибо, ребята, теперь у меня есть рабочее предположение об утечке памяти. Я начну искать решения для профилирования памяти. Также я все равно постараюсь поместить его в memcache. - person user1961; 23.04.2015
comment
Должна быть утечка памяти - я загрузил страницу, которая просто печатает «runtime.memory_usage().current()», и при каждом обновлении это значение увеличивается. - person user1961; 23.04.2015
comment
@user1961 user1961 re: чтение одного большого двоичного объекта из кэша памяти. Это зависит от размера ключа и скорости, с которой вы планируете его извлекать, но я подумал, что кто-то должен упомянуть об этом, прежде чем вы столкнетесь с проблемами масштабирования: распределите нагрузку по пространству ключей вашего кэша памяти. Дополнительные сведения см. здесь: cloud.google.com/ разработчики/статьи/ - person PrecariousJimi; 23.04.2015