在内存中加载大型字典时,会出现巨大的内存使用量。
在内存中加载大型字典时,会出现巨大的内存使用量。
我有一个文件,大小只有168MB。它只是一个逗号分隔的单词和ID的列表。
单词的长度可以是1到5个字符。有650万行。
我在Python中创建了一个字典,将其加载到内存中,以便可以将传入的文本与单词列表进行搜索。当Python将其加载到内存中时,显示使用了1.3GB的RAM空间。有什么原因呢?
假设我的单词文件看起来像这样...
1,word1
2,word2
3,word3
然后再添加650万个。
然后,我遍历该文件并创建一个字典(Python 2.6.1):
def load_term_cache(): """将从缓存文件中加载术语缓存,而不是访问mysql。如果不预加载到内存中,每个进程将进行2000万次查询""" global cached_terms dumpfile = os.path.join(os.getenv("MY_PATH"), 'datafiles', 'baseterms.txt') f = open(dumpfile) cache = csv.reader(f) for term_id, term in cache: cached_terms[term] = term_id f.close()
只是这样就会导致内存溢出。我查看活动监视器,它将内存占用到可用内存的所有空间,最高可达1.5GB的RAM。在我的笔记本电脑上,它刚开始交换。有没有办法以最高效的方式在Python中存储键/值对?
更新:我尝试使用anydb模块,但在440万条记录后就崩溃了。
浮点数是我尝试加载后经过的秒数
56.95
3400018
60.12
3600019
63.27
3800020
66.43
4000021
69.59
4200022
72.75
4400023
83.42
4600024
168.61
4800025
338.57
你可以看到它一开始运行得很好。每隔几秒钟插入20,000行,直到我遇到了障碍,时间翻倍了。
import anydbm i=0 mark=0 starttime = time.time() dbfile = os.path.join(os.getenv("MY_PATH"), 'datafiles', 'baseterms') db = anydbm.open(dbfile, 'c') #从现有的baseterm文件加载 termfile = os.path.join(os.getenv("MY_PATH"), 'datafiles', 'baseterms.txt.LARGE') for line in open(termfile): i += 1 pieces = line.split(',') db[str(pieces[1])] = str(pieces[0]) if i > mark: print i print round(time.time() - starttime, 2) mark = i + 200000 db.close()