无法为具有大小的数组分配内存

Posted

技术标签:

【中文标题】无法为具有大小的数组分配内存【英文标题】:Unable to Allocate Memory for an Array with Size 【发布时间】:2021-12-02 02:25:42 【问题描述】:

我是一个 NLP 菜鸟,正在做一个项目,我需要计算几种不同方法的准确度;但是,我在运行代码时不断收到内存错误。例如,我不断收到“无法为形状 (38045, 50000) 和数据类型 float64 的数组分配 14.2 GiB”,即使我转换为 uint8 数据类型并弄乱了 Windows 高级设置以更改内存分配。我的代码如下。


import sklearn
import numpy as np
import sklearn.feature_extraction.text
import pandas as pd 
df = pd.read_csv ('amprocessed.csv')
labels = df.iloc[:, 0]
import sklearn.model_selection
from sklearn.model_selection import train_test_split

from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer(max_features=50000, dtype="uint8")
#vectorizer = TfidfVectorizer()
X = (vectorizer.fit_transform(df["Source"]).toarray()).astype(dtype="uint8")

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler() 
xscale = scaler.fit_transform(X).astype(dtype=np.uint8)

from sklearn import svm
x_train, x_test, y_train, y_test = sklearn.model_selection.train_test_split(xscale, labels, test_size=0.2, random_state=42)

clf = svm.SVC(kernel='linear') # Linear Kernel

clf.fit(x_train, y_train).astype(dtype=np.uint8)

y_pred = clf.predict(x_test)

from sklearn import metrics
print("Accuracy:",metrics.accuracy_score(y_test, y_pred)

【问题讨论】:

在一个地方你使用dtype=np.uint8,但在其他地方它是dtype="uint8"。我认为后者应该是像第一个一样的 numpy 类型对象。 【参考方案1】:

这里的问题是您将CountVectorizer 的输出转换为np.arrayCountVectorizer 输出一个稀疏矩阵scipy.sparse.csr.csr_matrix,这是一种存储此类数据的有效方式。

Sparse Matrix 不会为每个文档设置一个 np.array 形状为 (50000,0) 的几乎所有值都等于 0 并且很少等于 1 的值,而是仅引用不等于 0 的值。如本例所示,这将大大减少内存占用:

from scipy.sparse import csr_matrix
import numpy as np
import sys

X = np.zeros((100_000))
X[0] = 1
print(f'size (bytes) of np.array sys.getsizeof(X)')
X_sparse = csr_matrix(X)
print(f'size (bytes) of Sparse Matrix sys.getsizeof(X_sparse)')

输出:

size (bytes) of np.array 800104
size (bytes) of Sparse Matrix 48

因此你应该修改你的预处理代码:

X = (vectorizer.fit_transform(df["Source"]).toarray())

除此之外,拟合函数应该简单地写成如下:

clf.fit(x_train, y_train)

【讨论】:

以上是关于无法为具有大小的数组分配内存的主要内容,如果未能解决你的问题,请参考以下文章

分配具有不同数量和大小的项目的特定大小的数组

指针数组的动态内存分配

内存分配“错误:无法分配大小为 75.1 Mb 的向量”[重复]

无法分配具有形状和数据类型的数组

使用 NULL 数组将内存分配给二维数组 (c)

Java静态内存与动态内存分配的解析