在内存中加载大型字典时,会出现巨大的内存使用量。

10 浏览
0 Comments

在内存中加载大型字典时,会出现巨大的内存使用量。

我有一个文件,大小只有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()

0