Лимиты теоретически ограничить можно, но практически - не нужно. 1.5 гб для ботика - это овердофига (если только он не обрабатывает десятки тысяч пользователей одновременно). Особенно если он асинхронный (запущен в одном процессе). Правильно - лечить проблему, а не её симптомы. Профилируй, почему у тебя бот столько жрёт. Вероятно, где-то что-то течёт. Плюс в питоне вагон способов уменьшить нагрузку на память от элементарного __slots__ до генераторов и Сишных библиотек
Ну и как сказал
mayton2019, после оптимизации, если это не спасает, нужно начинать горизонтально масштабировать нагрузку.
Тупо ограничить память - это просто шанс того, что придёт OOM Killer (или его аналог) и прибьёт твоё приложение, когда оно этого не ожидает. Да, есть инструменты, например, в golang, чтобы ограничить потребление памяти, но все они делают ровно одну вещь: управляют параметрами запуска сборщика __мусора__ (то есть, памяти, которая НЕ НУЖНА). На секундочку, протёкшая память не определяется как мусор, ровно как и не является мусором НУЖНАЯ память. Её никакие оптимизаторы не сожмут никакой магией.
Есть также техника, которая позволяет "костыльно", но быстро и иногда даже эффективно избавляться от утечек памяти, не решая саму причину утечек. Тупо перезапускать воркер после X обработанных запросов, то есть, стартовать новый процесс, перекидывать трафик на него, а старый убивать вместе со всей утёкшей памятью.