使用numpy保存列表时内存不足

时间:2017-12-17 17:38:16

标签: python numpy

我有一个相当大的列表,列出了搜狗文本分类数据集中的标记。我可以处理整个训练集450,000,剩下12个ram,但是当我在列表列表中调用numpy.save()时,内存使用量似乎翻了一倍,而且内存不足。

这是为什么? numpy.save是否在保存之前转换列表但保留列表因此使用更多内存?

是否有其他方法可以保存这份清单,即酸洗?我相信numpy save使用pickle协议来判断allow pickle参数:https://docs.scipy.org/doc/numpy/reference/generated/numpy.save.html

print "Collecting Raw Documents, tokenize, and remove stop words"
df = pd.read_pickle(path + dataSetName + "Train")
frequency = defaultdict(int)

gen_docs = []
totalArts = len(df)
for artNum in range(totalArts):
    if artNum % 2500 == 0:
        print "Gen Docs Creation on " + str(artNum) + " of " + str(totalArts)
    bodyText = df.loc[artNum,"fullContent"]
    bodyText = re.sub('<[^<]+?>', '', str(bodyText))
    bodyText = re.sub(pun, " ", str(bodyText))
    tmpDoc = []
    for w in word_tokenize(bodyText):
        w = w.lower().decode("utf-8", errors="ignore")
        #if w not in STOPWORDS and len(w) > 1:
        if len(w) > 1:
            #w = wordnet_lemmatizer.lemmatize(w)
            w = re.sub(num, "number", w)
            tmpDoc.append(w)
            frequency[w] += 1
    gen_docs.append(tmpDoc)
print len(gen_docs)

del df
print "Saving unfiltered gen"
dataSetName = path + dataSetName
np.save("%s_lemmaWords_noStop_subbedNums.npy" % dataSetName, gen_docs)

1 个答案:

答案 0 :(得分:0)

np.save首先尝试将输入转换为数组。毕竟它旨在保存numpy数组。

如果结果数组是带有数值或字符串值(dtype)的多维数据,则会保存一些基本维度信息,以及数组数据缓冲区的内存副本。

但是如果数组包含其他对象(例如dtype对象),那么它会对这些对象进行pickle,并保存生成的字符串。

我会尝试

arr = np.array(gen_docs)

这是否会产生内存错误?

如果没有,它的shapedtype是什么?

如果tmpDoc(子列表)的长度不同,arr将是一个带有对象dtype的1d数组 - 这些对象是tmpDoc列表。

只有当所有tmpDoc具有相同的长度时才会生成2d数组。即使这样,dtype也将取决于元素,无论是数字,字符串还是其他对象。

我可能会补充说,使用save协议对数组进行了腌制。