【问题标题】:Python3 Memory Error while modifying large dataset修改大型数据集时出现 Python3 内存错误
【发布时间】:2019-11-10 10:31:33
【问题描述】:

我正在尝试在 python3(64 位)中实现 symspell,我有一个 20 MB 的 txt 文件,其中包含有频率的单词。我可以成功地将这些数据加载到名为 originalDictionary 的字典中。作为字典中每个单词的下一步,我应该一次删除一个字符,并将修改后的单词添加到另一个名为 editDictionary 的字典中。但是我遇到了内存错误。 我在具有 16gb RAM 的 Windows10(x64) 上运行它。 我能做些什么来解决这个问题?

 for word in originalDictionary:
    for i in range(len(word)):
        edit1 = word[0:i] + word[i + 1:]
        if edit1 not in editedDictionary:
            editedDictionary[edit1] = [word]
        else:
            editedDictionary[edit1].append(word)

以下是错误:

    Traceback (most recent call last):
  File "C:\Program Files\JetBrains\PyCharm 2018.3.2\helpers\pydev\pydevd.py", line 1741, in <module>
    main()
  File "C:\Program Files\JetBrains\PyCharm 2018.3.2\helpers\pydev\pydevd.py", line 1735, in main
    globals = debugger.run(setup['file'], None, None, is_module)
  File "C:\Program Files\JetBrains\PyCharm 2018.3.2\helpers\pydev\pydevd.py", line 1135, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "C:\Program Files\JetBrains\PyCharm 2018.3.2\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "C:/Users/ee/PycharmProjects/SymSpell/spellCorrector.py", line 98, in <module>
    createDictionaries()
  File "C:/Users/ee/PycharmProjects/SymSpell/spellCorrector.py", line 40, in createDictionaries
    editedDictionary[edit1] = [word]
MemoryError

【问题讨论】:

  • 请显示完整的错误信息以及它发生在哪一行。
  • 一些统计数据可能会有所帮助。就像字典中的条目数,在出现内存错误之前它经过了多少次迭代,以及总体虚拟内存使用量是多少。我发现这样做是为了后者。 import psutil & print(psutil.virtual_memory()) 虽然需要用 pip 安装。
  • 你正在研究的规模相当大。原始字典的大小乘以超过每个单词的平均长度。

标签: python-3.x memory out-of-memory


【解决方案1】:

在最新版本的 SymSpell 算法中,您可以定义前缀长度。仅在此前缀内生成删除。较短的前缀长度会显着减少内存消耗,但会降低查找时间。前缀长度 = 5 通常是一个很好的折衷方案。

有一个 Python 端口的 SymSpell 可用,它支持设置前缀长度: https://github.com/mammothb/symspellpy

【讨论】:

    猜你喜欢
    • 2012-07-05
    • 2019-09-28
    • 1970-01-01
    • 2018-09-15
    • 2022-06-25
    • 2011-12-08
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多