我编写了一个简单的代码片段来处理一个文本文件,其中每行包含一个词组和词性标记词(例如I/noun am/verb),我想分别提取单词和标记:
splitted_sentences = []
splitted_pos = []
with open("my_path", "r") as tagged_sentences:
for sentence in tagged_sentences:
curr_sentence = []
curr_pos = []
for tag in sentence.strip().split(" "):
splitted_tag = tag.split("/")
word = splitted_tag[0]
pos = splitted_tag[1]
curr_sentence.append(word)
curr_pos.append(pos)
splitted_sentences.append(curr_sentence)
splitted_pos.append(curr_pos)
代码如预期的那样工作,但是,当循环执行得远远超过预期时,内存内存内存消耗从未停止增长(文本文件约为100MB,ram消耗峰值为5GB)。我尝试过使用一些内存分析工具,看起来我正在创建数千个列表引用(可能是curr_语句和curr_pos列表)。在不发生内存泄漏的情况下,解决这个问题的正确方法是什么?在
splitted_sentences
是字符串列表。列表的内存开销约为70字节,字符串的内存开销约为40字节。假设平均单词/词组为5个字节,平均句子为10个单词/词组对,则100MB文件为1M句子*10个单词*1个字符串=(1M*70)*(10*40)=28Gb内存(如果所有字符串都是唯一的)。显然,其中许多不是,但是这种内存消耗可以解释为没有内存泄漏。在我解决这个问题的方法是顺序处理。我怀疑你真的需要所有这些数据同时存储在内存中。用发电机更换主回路可能会改变游戏规则:
将curr_语句和curr_pos移到for循环之外。然后你可以清除而不是创建新的。我的猜测是,由于某种原因,curr_语句和curr_pos列表不会在for循环的末尾被删除。在
通过将这些列表移到for循环之外,您不会在每次迭代中创建新的列表。在
相关问题 更多 >
编程相关推荐