我在Python中打开一个3 GB的文件来读取字符串.然后我将这些数据存储在字典中.我的下一个目标是使用这个字典构建一个图形,所以我正在密切监视内存使用情况.
在我看来,Python将整个3 GB文件加载到内存中,我无法摆脱它.我的代码看起来像这样:
with open(filename) as data:
accounts = dict()
for line in data:
username = line.split()[1]
IP = line.split()[0]
try:
accounts[username].add(IP)
except KeyError:
accounts[username] = set()
accounts[username].add(IP)
print "The accounts will be deleted from memory in 5 seconds"
time.sleep(5)
accounts.clear()
print "The accounts have been deleted from memory"
time.sleep(5)
print "End of script"
Run Code Online (Sandbox Code Playgroud)
最后一行是在那里,以便我可以监视内存使用情况.该脚本在内存中使用超过3 GB的位.清除字典可以释放大约300 MB.当脚本结束时,释放剩余的内存.
我正在使用Ubuntu,我使用"系统监视器"和终端中的"免费"命令监视内存使用情况.
我不明白的是为什么在我清除字典之后Python需要这么多内存.文件是否仍存储在内存中?如果是这样,我怎么能摆脱它呢?我的操作系统没有看到释放内存的问题吗?
编辑:我已经尝试在清除字典后强行执行gc.collect(),但无济于事.
EDIT2:我在Ubuntu 12.04.LTS上运行Python 2.7.3
EDIT3:我意识到我忘了提到一些非常重要的东西.我真正的问题不在于我的操作系统没有"取回"Python使用的内存.后来,Python似乎没有重用那个内存(它只是要求操作系统有更多的内存).
我的目标是在文本中找到一个单词.需要注意的是,我需要将撇号视为文本.
让我举个例子来解释一下.假设我正在寻找文中的单词don:don't trust don.我需要匹配don但不是don't.
我从这个正则表达式开始:r'(?:\b)%s(?:\b)' % re.escape("don")但在这里它匹配两次出现don.然后我尝试了r'(?:\b|\w\')%s(?:\b|\'\w)' % re.escape("don"),但没有用.
如何使我的正则表达式将撇号视为文本?
编辑:我没有提到的一些边缘情况:'don并且don'是正确的匹配t'don,don't而'don'不是.