我遇到的问题是,当我运行脚本时,我需要创建一个非常大的字典(来自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分钟)。任何人都可以给我一个如何加快这个过程的建议吗?我怎样才能尽可能快地访问/创建我的字典?是否有任何可能的方法来创建它并保存以供将来使用?
感谢所有答案!
答案 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)行的块读取您的文件。