【问题标题】:Python 3 (3.5) - Load a very large dictionary fastPython 3 (3.5) - 快速加载非常大的字典
【发布时间】:2018-04-05 12:06:58
【问题描述】:

当我运行我的脚本(用于机器学习)时,我需要创建一个非常大的字典(来自 Google GloVe,400,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 分钟)。谁能给我一个关于如何加快进程的建议?我怎样才能尽快获得访问/创建我的字典?有什么方法可以创建一次并保存以备将来使用?

感谢所有答案!

【问题讨论】:

  • 除非您的程序在您尝试 exec 文件之前释放大量内存,否则我看不出您的方法不会导致内存不足错误。
  • 我的猜测是创建 400,000 个 numpy 数组很慢,而不是字典。您可以尝试将这些数组转换为仅按需成为数组的生成器,这样字典就只保存生成器,而不必一次解析所有这些行。

标签: python performance dictionary memory


【解决方案1】:

如果您需要等到程序中的某个点才实际分配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 调用的影响。

【讨论】:

  • 非常感谢您的建议 - 我会试试看!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多