ASP.NET - Использование флажков в повторителе

Память, выделенная на куче, может быть подвергнута воздействию водяных знаков. Это осложняется внутренней оптимизацией Python для выделения небольших объектов (PyObject_Malloc) в 4 пулах KiB, классифицированных для размеров размещения в кратных 8 байтах - до 256 байт (512 байт в 3.3). Сами пулы находятся в 256 KiB аренах, поэтому, если используется только один блок в одном пуле, вся 256 игровая зона KiB не будет выпущена. В Python 3.3 распределитель малых объектов был переключен на использование анонимных карт памяти вместо кучи, поэтому он должен лучше работать при освобождении памяти.

Кроме того, встроенные типы поддерживают фрилистов ранее выделенных объектов, которые могут или не может использовать распределитель малых объектов. Тип int поддерживает freelist с собственной выделенной памятью, и для его очистки требуется вызвать PyInt_ClearFreeList(). Это можно косвенно назвать полным gc.collect.

Попробуй так, и скажи мне, что получишь. Вот ссылка на psutil .

import os
import gc
import psutil

proc = psutil.Process(os.getpid())
gc.collect()
mem0 = proc.get_memory_info().rss

# create approx. 10**7 int objects and pointers
foo = ['abc' for x in range(10**7)]
mem1 = proc.get_memory_info().rss

# unreference, including x == 9999999
del foo, x
mem2 = proc.get_memory_info().rss

# collect() calls PyInt_ClearFreeList()
# or use ctypes: pythonapi.PyInt_ClearFreeList()
gc.collect()
mem3 = proc.get_memory_info().rss

pd = lambda x2, x1: 100.0 * (x2 - x1) / mem0
print "Allocation: %0.2f%%" % pd(mem1, mem0)
print "Unreference: %0.2f%%" % pd(mem2, mem1)
print "Collect: %0.2f%%" % pd(mem3, mem2)
print "Overall: %0.2f%%" % pd(mem3, mem0)

Выход:

Allocation: 3034.36%
Unreference: -752.39%
Collect: -2279.74%
Overall: 2.23%

Редактирование:

Я переключился на измерение относительно размер VM процесса для устранения эффектов других процессов в системе.

Среда выполнения C (например, glibc, msvcrt) сжимает кучу, когда смежное свободное пространство наверху достигает постоянного, динамического или настраиваемого порога , С помощью glibc вы можете настроить это с помощью mallopt (M_TRIM_THRESHOLD). Учитывая это, неудивительно, что куча сжимается больше - даже намного больше - чем блок, который вы free.

В 3.x range не создается список, поэтому в приведенном выше тесте не будет создано 10 миллионов int объектов. Даже если это так, тип int в 3.x в основном представляет собой 2.x long, который не реализует freelist.

1
задан Wes P 29 July 2010 в 20:13
поделиться

1 ответ

Это очень распространенная ошибка. Вы должны вызывать DataBind в событии Init, даже для постбэков.

2
ответ дан 2 September 2019 в 22:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: