Python 3(3.5) - 快速加载一个非常大的字典

时间:2018-04-05 12:06:59

标签: python performance dictionary memory

我遇到的问题是,当我运行脚本时,我需要创建一个非常大的字典(来自Google GloVe,400个&000,000个条目,由一个键组成,每个键包含100个元素的向量)(用于机器学习) )。这里的问题是创建字典需要大约60-160秒,但我需要将其减少很多,最好是低于10秒。我目前有两种方法(数字和字母都是随机的,而不是下面显示的那些):

1)运行以下命令(大约需要60秒):

file_input = codecs.open('dictFile.txt', 'r', 'UTF-8')
myDict = {}        

for line in file_input:
    line = line.strip()
    line = line.split(' ')
    if len(line)==0:continue
    token = line[0]
    vector = np.array([float(x) for x in line[1:]])
    myDict[token] = vector
file_input.close()

其中dictFile.txt具有以下结构:

a 1 2 3 4 5 6 ... 100
b 1 2 3 4 5 6 ... 100
...
c 1 2 3 4 5 6 ... 100

2)运行以下(大约需要160秒)

readFile = open('dictFile.py', 'r', encoding='utf8')
    for line in readFile:
        exec(line)

dictFile.py的格式如下:

import numpy as np

myDict = {}
myDict['a']=np.array([1, 2, 3, ... , 100])
myDict['b']=np.array([1, 2, 3, ... , 100])
...
myDict['c']=np.array([1, 2, 3, ... , 100])

问题是我不能简单地运行

from dictFile import myDict

因为这会让我的内存耗尽(并将我的电脑挂起大约10分钟)。任何人都可以给我一个如何加快这个过程的建议吗?我怎样才能尽可能快地访问/创建我的字典?是否有任何可能的方法来创建它并保存以供将来使用?

感谢所有答案!

2 个答案:

答案 0 :(得分:0)

如果您需要等到程序中的某个点实际分配dict,请定义一个创建并返回它的函数,以便您可以控制何时调用它。

dictFile.py

import numpy as np

def create_mydict():
    myDict = {}
    myDict['a'] = np.array(...)
    ...

然后在你的代码中,

myDict = dictFile.create_mydict()

如果您确实需要myDict作为模块级变量存在,那么您可以将其声明为此类并让create_mydict()填充全局。

import numpy as np

myDict = None
def create_mydict():
    global myDict
    myDict['a'] = ...
    ...

您还可以根据需要有条件地致电create_mydict

if dictFile.myDict is None:
    dictFile.create_mydict()

这要求您使用import dictFile,而不是from dictFile import myDict,因为后者会从dictFile.myDict创建一个不受create_mydict调用影响的单独全局名称。

答案 1 :(得分:0)

您可以尝试在多个线程之间通过(400000 / CPU_core)行的块读取您的文件。