[python] Alokace pameti
slush
slush na slush.cz
Čtvrtek Prosinec 25 18:46:41 CET 2008
Zdravim,
narazil jsem na problem, ktery nedokazu vysvetlit. Mozna je nekde chyba, ale
mnohem pravdepodobneji jen neco delam spatne ja. Jedna se o abnormalni
"nenazranost" pythonu a o nasledne neuvolnovani pameti pote, co naalokovanou
pamet jiz nepotrebuji.
V priloze zasilam jednoduchy skript,ktery nejdrive naalokuje seznam o delce
10 mil. zaznamu, nasledne seznam smaze (nastavenim seznamu na nulovou delku)
a opet ho naalokuje. Cekal bych, ze pametova narocnost bude nekde v rozmezi
desitek MB (tedy v prumeru do 10 bytes na jednu polozku ciselneho seznamu) a
ze po uvolneni seznamu dojde ke zmenseni obsazene pameti na predchozi
uroven.
Problem 1) Python si pro 10 mil. číselných záznamů naalokoval cca 160 MB.
Problem 2) Po odalokovani klesla spotreba pameti na 120MB
Podle hrubych internich vypoctu mi vychazi, ze ten 40MB rozdil je uvolneni
datovych struktur primo spojenych s ulozenym seznamem a po uvolneni seznamu
opravdu dochazi k odalokovani. Neni mi ale jasne, co obsahuje zbyvajicich
120MB.
Zkousel jsem do tohoto skriptu zapracovat i spravu garbage collectoru (model
gc). Bohuzel, po odalokovani pameti gc neobsahoval zadne informace o zabrane
pameti,ackoliv skript stale konzumoval 120 MB.
Prilozeny skript a vyse obsazenych prostredku jsem overoval pod Linuxem a
Windows Vista, v obou pripadech se stejnym vysledkem (v Linuxu byla celkova
spotreba o cca 4 MB mensi).
Hlavni otazkou tedy je, jestli je toto chovani normalni, respektive jestli
lze nejak ridit spotrebu pameti pythonem.
Diky za kazdy tip,
Marek
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://www.py.cz/pipermail/python/attachments/20081225/0c1ca1ca/attachment.htm>
------------- další část ---------------
x = []
i = 10000000
while i>0:
i -= 1
x.append(i)
# Naalokovano cca 160MB
print "Stiskni Enter"
raw_input()
x = []
# Naalokovano cca 120MB
print "Stiskni Enter"
raw_input()
i = 10000000
while i>0:
i -= 1
x.append(i)
# Naalokovano cca 160MB
print "Stiskni Enter"
raw_input()
Další informace o konferenci Python