Windows下Scipy处理小文件出现Bow Memory Error问题求助
解决Windows下Python构建词矩阵时的MemoryError问题
首先咱们直接揪出问题核心:你Windows上安装的是32位Python——从报错路径c:\program files (x86)\python36-32\lib就能明确看出来。32位进程的内存上限通常在4GB左右(实际可用空间还要更小),哪怕你的系统有16GB物理内存,32位Python也没法利用超出的部分,这就是为什么明明内存剩余很多却触发了内存错误。而你的Mac用的是64位Python,自然能顺畅运行。
下面给你两个优先级不同的解决方案:
1. 更换为64位Python(最彻底的解决办法)
卸载当前的32位Python3.6,去Python官网下载对应版本的64位安装包重新安装。64位Python可以充分利用系统的大内存,后续不管是转密集矩阵还是处理更大的数据集,都不会再因为内存地址空间限制报错。
2. 避免将稀疏矩阵转为密集矩阵(更高效的最优做法)
其实你完全没必要调用todense()!bow_features是scipy的稀疏矩阵,scikit-learn里几乎所有的机器学习模型、特征转换工具(比如你导入的TfidfTransformer)都支持直接使用稀疏矩阵作为输入。
稀疏矩阵只会存储非零元素,内存占用极低——你的数据集只有7k多唯一token,稀疏矩阵的内存占用可能只有几MB。而转成密集矩阵后,会把所有零元素都存起来,既浪费内存又拖慢计算速度。
修改后的代码示例:
import pandas as pd from sklearn.feature_extraction.text import TfidfTransformer from sklearn.feature_extraction.text import CountVectorizer corpus = open("cleancorpus.txt","r",encoding = "utf8") def bow_extractor(corpus, ngram_range=(1,1)): vectorizer = CountVectorizer( analyzer=u'word', binary=False, decode_error=u'strict', encoding=u'utf-8', input=u'content', lowercase=True, max_df=1.0, max_features=None, min_df=1, ngram_range=ngram_range, preprocessor=None, stop_words=None, strip_accents=None, token_pattern=u'(?u)\\b\\w\\w+\\b', tokenizer=None, vocabulary=None ) features = vectorizer.fit_transform(corpus) return vectorizer, features bow_vectorizer, bow_features = bow_extractor(corpus) # 直接用稀疏矩阵做后续操作,比如TF-IDF转换 tfidf_transformer = TfidfTransformer() tfidf_features = tfidf_transformer.fit_transform(bow_features) # 后续建模直接用tfidf_features或者bow_features即可
顺便提一句,你之前遇到的spacy MemoryError问题,很大概率也是32位Python的内存限制导致的,换成64位版本应该也能解决类似问题。
内容的提问来源于stack exchange,提问作者FMassion
相关产品推荐
相关产品推荐

