Это не очень хороший способ управления памятью. К тому времени, когда вы видите MemoryError, вы уже находитесь в критическом состоянии, когда ядро, вероятно, близко к уничтожению процессов, чтобы освободить память, и во многих системах вы никогда не увидите его, потому что оно пойдет на подкачку или просто OOM убить ваш процесс, а не сбой распределения.
Единственный восстанавливаемый случай, который вы можете увидеть в MemoryError, - это попытка выполнить очень большое выделение, которое не помещается в доступное адресное пространство, только для 32-битных систем.
Если вы хотите иметь кеш, который освобождает память, необходимую для других распределений, он должен взаимодействовать не с ошибками , а с самим распределителем. Таким образом, когда вам нужно освободить память для выделения, вы будете знать , сколько нужно непрерывной памяти, иначе вы будете угадывать вслепую. Это также означает, что вы можете отслеживать распределение памяти по мере того, как оно происходит, поэтому вы можете сохранить использование памяти на определенном уровне, не позволяя ей расти беспрепятственно, а затем пытаясь восстановить, когда она становится слишком высокой.
Я бы настоятельно предположил, что для большинства приложений этот вид кэширования слишком сложен - вам, как правило, лучше просто использовать установленный объем памяти для кэша.