0

我有一个关于我拥有的特定 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 文件并解析每一行,然后使用名为 combo_count 的字典计算共现。问题是字典一旦导出,只有大约 1.2GB,但是当我运行这段代码时,它使用的内存比这多得多。但我能看到的唯一会占用大量内存的是字典。我怀疑某些东西正在占用不应该的内存。处理完每一行后,应该从内存中删除除计数字典之外的所有内容。除了字典之外,任何人都可以在代码中看到任何会耗尽内存的内容吗?我怀疑它在 body_parser 函数中的某个地方。

4

1 回答 1

0

@用户

您可以使用 python 的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

于 2016-04-11T04:44:33.893 回答