【问题标题】:Memory Error when trying to create numpy matrix尝试创建 numpy 矩阵时出现内存错误
【发布时间】:2017-05-02 13:12:30
【问题描述】:
text = codecs.open("lith.txt", encoding= 'utf-8')
text = text.read().lower().replace('"','').replace('?','').replace(',','').replace('!','').replace('.','')
text = text.split()
words = sorted(list(set(text)))
Unigram = np.zeros([len(words)])
ind = range(len(words))
Lexicon = dict(zip(words,ind))
Bigram = np.zeros([len(words),len(words)])

我在这部分程序的最后一行中一直遇到重大问题。文本文件大约有 7,000,000 字长。目前,字数/长度约为200,000。当我将文本文件剪切到单词长度变为 40,000 左右时,程序就可以工作了。有没有办法绕过这个内存限制?谢谢你的帮助。如果我只是继续剪切部分文本直到内存错误消失,我在程序后面部分得到的结果似乎真的会受到影响。

for n in range(len(text)-1):
    Unigram[Lexicon[text[n]]] = Unigram[Lexicon[text[n]]] + 1
    Bigram[Lexicon[text[n]]][Lexicon[text[n+1]]] = Bigram[Lexicon[text[n]]][Lexicon[text[n+1]]] + 1
Unigram_sorted = np.argsort(Unigram)
Unigram_sorted = Unigram_sorted[::-1]
Unigram_sorted = Unigram_sorted[0:4999]

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    我假设引发异常的行:

    Bigram = np.zeros([len(words),len(words)])
    

    如果len(words) 为 200,000,则矩阵的大小为 200,000^2 个整数。假设int64,这需要320gb的内存。

    假设大多数条目将保持为零,稀疏矩阵可能会有所帮助。例如,scipy's sparse matrices。在计算关节对的情况下,这个 sn-p 可能会有所帮助:

    from scipy.sparse.dok import dok_matrix
    
    Bigrams = dok_matrix((len(words), len(words)))
    # Bigrams[i, j] += 1
    

    关于代码本身,第一部分可能在scikit-learn text vectorizers有一个相对相似的实现。

    【讨论】:

    • 这确实是导致问题的行;它在单词长度小得多时起作用。我正在查看稀疏矩阵,但不确定如何使用它们。你能就我如何设置一个提供任何建议吗?
    • 好的,你能详细说明你需要对矩阵做什么吗?
    • 程序的下一部分基本上是计算单词中每个单词的二元组频率,然后我保存最频繁的 5,000 行和最频繁的 5,000 列,所以我真的没有最终使用大部分程序其余部分中的那个庞大的矩阵。
    • 我已编辑并添加了dok_matrix() 的示例。根据构建后的使用情况,可能会改成切片效率更高的表示,如csr_matrixcsc_matrix
    • 我还有一个可能很愚蠢的问题。当我尝试遍历矩阵时,会出现“超出范围”之类的错误,所以我想我真的不明白稀疏矩阵是如何工作的。
    猜你喜欢
    • 2019-02-20
    • 2013-10-05
    • 2013-10-17
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 2020-08-01
    相关资源
    最近更新 更多