GAE имеет различные ограничения, один из которых представляет собой размер наибольшего выделяемого блока памяти в размере 1 Мб (теперь в 10 раз больше, но это не меняет вопрос). Ограничение означает, что в список() нельзя поместить больше некоторого количества элементов, поскольку CPython попытается выделить смежный блок памяти для указателей элементов. Наличие огромного списка() s можно считать плохой практикой программирования, но даже если в самой программе не создается огромная структура, CPython поддерживает некоторые за кулисами.Внутренние структуры CPython
Похоже, что CPython поддерживает один глобальный список объектов или что-то в этом роде. То есть приложение с множеством мелких объектов имеет тенденцию выделять все большие и большие отдельные блоки памяти.
Первой идеей был gc, и ее отключение изменяет поведение приложения немного, но все же сохраняются некоторые структуры.
Простейшие короткого приложение, которое испытывают проблемы является:
a = b = []
number_of_lists = 8000000
for i in xrange(number_of_lists):
b.append([])
b = b[0]
Может кто-нибудь просветить меня, как предотвратить CPython от выделения огромных внутренних структур при наличии многих объектов в приложении?
Что такое ** настоящий ** вопрос. Почему заканчивается память? Какая конкретная проблема у вас есть, которая, кажется, требует огромных блоков памяти? Вероятно, вы можете исправить эту проблему, чтобы не выделять память в первую очередь. Какую ** настоящую ** проблему вы пытаетесь решить? –