内存错误:在使用anymodel.fit()时,无法为具有形状和数据类型的数组分配MiB。 (涉及sklearn技术)

16

出现了内存错误。但是我按照书上或链接中的代码操作时却没有出现这个错误。

部分代码:

from sklearn.linear_model import SGDClassifier
sgd_clf = SGDClassifier()
sgd_clf.fit(x_train, y_train)

错误: MemoryError:无法为形状为(60000,784)和数据类型float64的数组分配359.MiB

我在使用StandardScaler的fit_transfrom缩放数据时也遇到了这个错误

但如果我减小训练集的大小(例如:x_train[:1000]y_train[:1000]),两个都能运行良好

书中代码链接在此处。我得到的错误在第60和63行(In [60]In [63]

书籍:Aurélien Géron - Hands-On Machine Learning with Scikit-Learn Keras and Tensorflow 2nd Ed(第149 / 1130页)

所以我的问题是:

这与我的内存有关吗?“无法分配359”是什么意思?它是内存大小吗?

我的电脑信息: CPU - ryzen 2400g , ram - 8gb (使用jupyter笔记本时还剩下3.1gb)



1
你的问题有任何更新吗?重启有帮助还是你设法以其他方式解决了问题? - sns
1
不好意思,尝试了各种方法仍然没有成功。现在决定只处理数据集的一小部分,直到我升级内存。 - Redwan Hossain Arnob
1
你是在使用partial_fit()函数还是只使用数据集的子集? - sns
使用了数据集的子集。但稍后会尝试 partial_fit() 看看情况如何。 - Redwan Hossain Arnob
4个回答

7
这条信息很直白,与可用内存有关。
359 MiB = 359 * 2^20 字节 = 60000 * 784 * 8 字节
其中MiB = Mebibyte = 2^20 字节,60000 x 784 是您数组的维度,8 字节是float64的大小。
也许3.1gb的空闲内存非常分散,不可能在一个连续的区域中分配359 MiB?
在这种情况下,重新启动可能会有帮助。

1
哇,我从未见过有人使用IEC / ISO标准;甚至以前从未听说过Mebibyte! - NealWalters
1
scikit-learn在其内存错误消息中使用它,这就是我解释的原因。我有一种感觉,随着时间的推移,这些单位正在越来越多地被使用。也许学校和大学的教育材料已经慢慢更新,以利用IEC标准,新一代人正在学习它。 - sns

6

升级Python 64位似乎解决了所有的“内存错误”问题。


14
我正在使用64位系统,但仍出现了问题。这个答案是不正确的。 - apYan
@apYan,这就是为什么64位应该解决问题的原因 https://dev59.com/wHA75IYBdhLWcg3wxcDV#3117794。在执行程序之前,请仔细检查您的Python版本(从哪里执行代码),因为您可以在同一台机器上拥有多个Python环境。 - Redwan Hossain Arnob

1

你尝试过将数据类型转换为较小的类型吗?例如从float64转换为float32或者如果可能的话转换为np.uint8?

Pred['train'] = Pred['train'].astype(np.uint8,errors='ignore')


1
问题通过安装64位Python解决了。32位无法分配超过一定范围的内存。 - Redwan Hossain Arnob

-2

关闭所有选项卡和软件后,只需重新启动您的电脑。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接