无法为具有大小的数组分配内存
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.array
。 CountVectorizer
输出一个稀疏矩阵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)
【讨论】:
以上是关于无法为具有大小的数组分配内存的主要内容,如果未能解决你的问题,请参考以下文章