2013-11-02 8 views
0

У меня вопрос об управлении памятью для определенной части кода 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.

+0

Как большой это ваш файл csv? – hurturk

+1

Может случиться так, что gc не освобождает память, потому что она не вызывается. Попробуйте http://stackoverflow.com/questions/1641717/manual-garbage-collection-in-python и посмотрите, все ли потребление памяти по-прежнему велико. – orange

+0

Оригинальный файл csv составляет около 6 ГБ. Но я никоим образом не сохраняю его в памяти. Я просто читаю каждую строку, подсчитываю, а затем бросаю эту строку. – user1893354

ответ

0

@user

Вы можете использовать Питон memory_profiler, чтобы проверить, какое переменный используют больше памяти и никогда не выпускать его.

Это дополнение предоставляет декоратор @profile, который позволяет отслеживать использование определенной функции памяти. Он чрезвычайно прост в использовании.

import copy 
import memory_profiler 

@profile 
def function(): 
    x = list(range(1000000)) # allocate a big list 
    y = copy.deepcopy(x) 
    del x 
    return y 

if __name__ == "__main__": 
    function() 

Для вызова:

python -m memory_profiler memory-profile-me.py 

Это напечатает результат, аналогичный ниже:

Line # Mem usage Increment Line Contents 
================================================ 
    4        @profile 
    5  9.11 MB  0.00 MB def function(): 
    6  40.05 MB  30.94 MB  x = list(range(1000000)) # allocate a big list 
    7  89.73 MB  49.68 MB  y = copy.deepcopy(x) 
    8  82.10 MB  -7.63 MB  del x 
    9  82.10 MB  0.00 MB  return y 

Даже, подробно объяснение того же дается по адресу: http://deeplearning.net/software/theano/tutorial/python-memory-management.html

Смежные вопросы