我正在运行一个生成n-gram的文本机器学习算法。这当然会大量地扩大输入的大小。把它放在上下文中,原始输入是在一个文件中约30K行,在生成三元素之后,我有348000个条目。Python可以使用硬盘作为额外的内存吗?
我使用scikit
及其TfidfVectorizer
,如果给出的值太多,我会得到由numpy数组抛出的MemoryError
。在我达到极限之前,我只能使用〜27500个卦。这意味着我只能使用最多10%的可用数据。
我能做些什么来帮助解决这个问题?我有什么选择吗?
我正在运行一个生成n-gram的文本机器学习算法。这当然会大量地扩大输入的大小。把它放在上下文中,原始输入是在一个文件中约30K行,在生成三元素之后,我有348000个条目。Python可以使用硬盘作为额外的内存吗?
我使用scikit
及其TfidfVectorizer
,如果给出的值太多,我会得到由numpy数组抛出的MemoryError
。在我达到极限之前,我只能使用〜27500个卦。这意味着我只能使用最多10%的可用数据。
我能做些什么来帮助解决这个问题?我有什么选择吗?
正如@jme所提到的,python对OS的内存管理没有影响。 可能最合理的方法(如果找不到具有更多RAM的机器)将以某种方式限制功能的数量,例如,与TfidfVectorizer以下选项参数中的一个:
max_df:漂浮在范围[0.0,1.0]或者int,默认= 1.0
在构建词汇忽略具有文档频率严格条件高于给定的阈值(语料库专用停用词)。如果为float,则该参数表示文档的比例,即整数绝对计数。如果词汇不是无,则忽略此参数。
min_df:在浮球范围[0.0,1.0]或者int,默认= 1
在构建词汇忽略具有文档频率大于给定阈值低严格条件。这个值在文献中也被称为截断值。如果为float,则该参数表示文档的比例,即整数绝对计数。如果词汇不是无,则忽略此参数。
max_features:int或无,默认=无
如果不是无,建立一个词汇表,只考虑通过在语料库词频排序顶部max_features。
如果词汇不是无,则忽略此参数。
我确实发现我的问题。事实证明,矢量化器非常高效,但如果你在矢量上调用toarray(),它会杀死内存。一旦我意识到,事情变得更好。 –
我相信这是一个真正的操作系统问题,因为它是通过操作系统,可以分配一定量的磁盘空间作为分页或虚拟内存。但它会减慢速度*令人难以置信*。要么找到一台拥有更多内存的机器,要么完全重新思考你的方法可能会更好。 – jme
查看[这个问题](http://stackoverflow.com/questions/5537618/memory-errors-and-list-limits-in-python)了解一些信息。确保你使用的是64位Python而不是32位。 – bbayles