Код чрезвычайно прост. Утечек быть не должно, так как все делается внутри функции. И ничего не возвращается. У меня есть функция, которая просматривает все строки в файле (~ 20 МБ) и помещает их все в список.
Упомянутая функция:
def read_art_file(filename, path_to_dir):
import codecs
corpus = []
corpus_file = codecs.open(path_to_dir + filename, 'r', 'iso-8859-15')
newline = corpus_file.readline().strip()
while newline != '':
# we put into @article a @newline of file and some other info
# (i left those lists blank for readability)
article = [newline, [], [], [], [], [], [], [], [], [], [], [], []]
corpus.append(article)
del newline
del article
newline = corpus_file.readline().strip()
memory_usage('inside function')
for article in corpus:
for word in article:
del word
del article
del corpus
corpus_file.close()
memory_usage('inside: after corp deleted')
return
Вот основной код:
memory_usage('START')
path_to_dir = '/home/soshial/internship/training_data/parser_output/'
read_art_file('accounting.n.txt.wpr.art', path_to_dir)
memory_usage('outside func')
time.sleep(5)
memory_usage('END')
Все memory_usage
просто печатает количество КиБ, выделенное сценарием.
Выполнение скрипта
Если я запускаю скрипт, он дает мне:
НАЧАЛЬНАЯ память: 6088 КБ
внутренняя память: 393752 КБ (файл 20 МБ + списки занимают 400 МБ)
внутренняя: после удаления корпорации память: 43360 КБ
внешняя функциональная память: 34300 КиБ (34300-6088= 28 МиБ утекло)
ФИНИШ памяти: 34300 КиБ
Выполнение без списков
И если я сделаю абсолютно то же самое, но с добавлением article
к закомментированному corpus
:
article = [newline, [], [], [], [], [], ...] # we still assign data to `article`
# corpus.append(article) # we don't have this string during second execution
Таким образом, вывод дает мне:
НАЧАЛЬНАЯ память: 6076 КБ
внутренняя память: 6076 КБ
внутренняя: после удаления корпорации память: 6076 КБ
внешняя функциональная память: 6076 КБ
КОНЕЧНАЯ память: 6076 КиБ
ВОПРОС:
Следовательно, таким образом освобождается вся память. Мне нужно освободить всю память, так как я собираюсь обрабатывать сотни таких файлов.
Я что-то делаю не так или это ошибка интерпретатора CPython?
UPD. Вот как я проверяю потребление памяти (взято из другого вопроса о стеке):
def memory_usage(text = ''):
"""Memory usage of the current process in kilobytes."""
status = None
result = {'peak': 0, 'rss': 0}
try:
# This will only work on systems with a /proc file system
# (like Linux).
status = open('/proc/self/status')
for line in status:
parts = line.split()
key = parts[0][2:-1].lower()
if key in result:
result[key] = int(parts[1])
finally:
if status is not None:
status.close()
print('>', text, 'memory:', result['rss'], 'KiB ')
return