У меня вопрос об управлении памятью для определенной части кода python, который у меня есть. Вот кодПроблема с управлением памятью Python
def combo_counter(file_path,title_body,validation=None,val_set=None,val_number=None):
combo_count={}
counter=0
with open(file_path+"/Train.csv") as r:
reader=csv.reader(r)
next(r)
if title_body=='body':
for row in reader:
if (validation is not None) and ((int(row[0])>val_set[0]) and (int(row[0])<val_set[-1])):
continue
counter+=1
if counter%10000==0:
print counter
no_stops=body_parser(row)
a=' '.join(no_stops)
b=row[3]
for x, y in product(a.split(), b.split()):
if x+" "+y in combo_count:
combo_count[x+" "+y]+=1
else:
combo_count[x+" "+y]=1
return combo_count
def body_parser(row):
soup=BS(row[2],'html')
for tag in soup.findAll(True):
if tag.name in bad_tags:
tag.extract()
code_removed=soup.renderContents()
tags_removed=re.sub(r'<[^>]+>', '', code_removed)
parse_punct=re.findall(r"[\w+#]+(?:[-'][\w+#]+)*|'|[-.(]+|\S[\w+#]*",tags_removed)
no_punct=' '.join(w.lower() for w in parse_punct if w not in string.punctuation)
no_stops=[b for b in no_punct.split(' ') if not b in stops]
return no_stops
Поэтому в основном я читаю CSV файл строка за строкой и разбора каждой строки, а затем рассчитывает со-occurrances использованием словаря под названием combo_count. Проблема заключается в том, что словарь, который был экспортирован, составляет всего около 1,2 ГБ, однако, когда я запускаю этот код, он использует гораздо больше памяти, чем это. Но единственное, что я вижу, это использование значительного объема памяти - это словарь. Я подозреваю, что что-то использует память, которой не должно быть. После обработки каждой строки все должно быть удалено из памяти, кроме словарного словаря. Может ли кто-нибудь увидеть что-нибудь в коде, который будет использовать память вместо словаря? Я подозреваю, что это где-то в функции body_parser.
Как большой это ваш файл csv? – hurturk
Может случиться так, что gc не освобождает память, потому что она не вызывается. Попробуйте http://stackoverflow.com/questions/1641717/manual-garbage-collection-in-python и посмотрите, все ли потребление памяти по-прежнему велико. – orange
Оригинальный файл csv составляет около 6 ГБ. Но я никоим образом не сохраняю его в памяти. Я просто читаю каждую строку, подсчитываю, а затем бросаю эту строку. – user1893354