Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python scikit学习作业库错误:多处理池self.value超出';i';格式化代码,仅适用于大型numpy数组_Python_Numpy_Multiprocessing_Scikit Learn_Anaconda - Fatal编程技术网

Python scikit学习作业库错误:多处理池self.value超出';i';格式化代码,仅适用于大型numpy数组

Python scikit学习作业库错误:多处理池self.value超出';i';格式化代码,仅适用于大型numpy数组,python,numpy,multiprocessing,scikit-learn,anaconda,Python,Numpy,Multiprocessing,Scikit Learn,Anaconda,我的代码在较小的测试样本中运行良好,比如X\u列,y\u列中有10000行数据。当我对数百万行调用它时,我得到了结果错误。是程序包中的错误,还是我可以做一些不同的事情?我使用的是来自Anaconda 2.0.1的Python 2.7.7,我将来自Anaconda的多处理包和scikit learn的外部包的代码放在我的Dropbox上 测试脚本是: import numpy as np import sklearn from sklearn.linear_model import SGDClas

我的代码在较小的测试样本中运行良好,比如
X\u列
y\u列
中有10000行数据。当我对数百万行调用它时,我得到了结果错误。是程序包中的错误,还是我可以做一些不同的事情?我使用的是来自Anaconda 2.0.1的Python 2.7.7,我将来自Anaconda的多处理包和scikit learn的外部包的代码放在我的Dropbox上

测试脚本是:

import numpy as np
import sklearn
from sklearn.linear_model import SGDClassifier
from sklearn import grid_search
import multiprocessing as mp


def main():
    print("Started.")

    print("numpy:", np.__version__)
    print("sklearn:", sklearn.__version__)

    n_samples = 1000000
    n_features = 1000

    X_train = np.random.randn(n_samples, n_features)
    y_train = np.random.randint(0, 2, size=n_samples)

    print("input data size: %.3fMB" % (X_train.nbytes / 1e6))

    model = SGDClassifier(penalty='elasticnet', n_iter=10, shuffle=True)
    param_grid = [{
        'alpha' : 10.0 ** -np.arange(1,7),
        'l1_ratio': [.05, .15, .5, .7, .9, .95, .99, 1],
    }]
    gs = grid_search.GridSearchCV(model, param_grid, n_jobs=8, verbose=100)
    gs.fit(X_train, y_train)
    print(gs.grid_scores_)

if __name__=='__main__':
    mp.freeze_support()
    main()
这将导致输出:

Vendor:  Continuum Analytics, Inc.
Package: mkl
Message: trial mode expires in 28 days
Started.
('numpy:', '1.8.1')
('sklearn:', '0.15.0b1')
input data size: 8000.000MB
Fitting 3 folds for each of 48 candidates, totalling 144 fits
Memmaping (shape=(1000000L, 1000L), dtype=float64) to new file c:\users\laszlos\appdata\local\temp\4\joblib_memmaping_pool_6172_78765976\6172-284752304-75223296-0.pkl
Failed to save <type 'numpy.ndarray'> to .npy file:
Traceback (most recent call last):
  File "C:\Anaconda\lib\site-packages\sklearn\externals\joblib\numpy_pickle.py", line 240, in save
    obj, filename = self._write_array(obj, filename)
  File "C:\Anaconda\lib\site-packages\sklearn\externals\joblib\numpy_pickle.py", line 203, in _write_array
    self.np.save(filename, array)
  File "C:\Anaconda\lib\site-packages\numpy\lib\npyio.py", line 453, in save
    format.write_array(fid, arr)
  File "C:\Anaconda\lib\site-packages\numpy\lib\format.py", line 406, in write_array
    array.tofile(fp)
ValueError: 1000000000 requested and 268435456 written

Memmaping (shape=(1000000L, 1000L), dtype=float64) to old file c:\users\laszlos\appdata\local\temp\4\joblib_memmaping_pool_6172_78765976\6172-284752304-75223296-0.pkl
Vendor:  Continuum Analytics, Inc.
Package: mkl
Message: trial mode expires in 28 days
Vendor:  Continuum Analytics, Inc.
Package: mkl
Message: trial mode expires in 28 days
Vendor:  Continuum Analytics, Inc.
Package: mkl
Message: trial mode expires in 28 days
Vendor:  Continuum Analytics, Inc.
Package: mkl
Message: trial mode expires in 28 days
Vendor:  Continuum Analytics, Inc.
Package: mkl
Message: trial mode expires in 28 days
Vendor:  Continuum Analytics, Inc.
Package: mkl
Message: trial mode expires in 28 days
Vendor:  Continuum Analytics, Inc.
Package: mkl
Message: trial mode expires in 28 days
Vendor:  Continuum Analytics, Inc.
Package: mkl
Message: trial mode expires in 28 days
Traceback (most recent call last):
  File "S:\laszlo\gridsearch_largearray.py", line 33, in <module>
    main()
  File "S:\laszlo\gridsearch_largearray.py", line 28, in main
    gs.fit(X_train, y_train)
  File "C:\Anaconda\lib\site-packages\sklearn\grid_search.py", line 597, in fit
    return self._fit(X, y, ParameterGrid(self.param_grid))
  File "C:\Anaconda\lib\site-packages\sklearn\grid_search.py", line 379, in _fit
    for parameters in parameter_iterable
  File "C:\Anaconda\lib\site-packages\sklearn\externals\joblib\parallel.py", line 651, in __call__
    self.retrieve()
  File "C:\Anaconda\lib\site-packages\sklearn\externals\joblib\parallel.py", line 503, in retrieve
    self._output.append(job.get())
  File "C:\Anaconda\lib\multiprocessing\pool.py", line 558, in get
    raise self._value
struct.error: integer out of range for 'i' format code
供应商:Continuum Analytics,Inc。
包装:mkl
消息:试用模式将在28天后过期
起动。
(‘numpy:’,‘1.8.1’)
('sklearn:','0.15.0b1')
输入数据大小:8000.000MB
48名候选人每人试衣3次,共计144次
Memmaping(shape=(1000000L,1000L),dtype=float64)到新文件c:\users\laszlos\appdata\local\temp\4\joblib\u Memmaping\u pool\u 6172\u 78765976\6172-284752304-75223296-0.pkl
未能保存到.npy文件:
回溯(最近一次呼叫最后一次):
文件“C:\Anaconda\lib\site packages\sklearn\externals\joblib\numpy\u pickle.py”,第240行,保存
obj,filename=self.\u write\u数组(obj,filename)
文件“C:\Anaconda\lib\site packages\sklearn\externals\joblib\numpy\u pickle.py”,第203行,在写数组中
self.np.save(文件名,数组)
文件“C:\Anaconda\lib\site packages\numpy\lib\npyio.py”,第453行,保存
格式化写入数组(fid、arr)
文件“C:\Anaconda\lib\site packages\numpy\lib\format.py”,第406行,在write\u数组中
数组.tofile(fp)
ValueError:请求100000000,写入268435456
Memmaping(shape=(1000000L,1000L),dtype=float64)到旧文件c:\users\laszlos\appdata\local\temp\4\joblib\u Memmaping\u pool\u 6172\u 78765976\6172-284752304-75223296-0.pkl
供应商:Continuum Analytics,Inc。
包装:mkl
消息:试用模式将在28天后过期
供应商:Continuum Analytics,Inc。
包装:mkl
消息:试用模式将在28天后过期
供应商:Continuum Analytics,Inc。
包装:mkl
消息:试用模式将在28天后过期
供应商:Continuum Analytics,Inc。
包装:mkl
消息:试用模式将在28天后过期
供应商:Continuum Analytics,Inc。
包装:mkl
消息:试用模式将在28天后过期
供应商:Continuum Analytics,Inc。
包装:mkl
消息:试用模式将在28天后过期
供应商:Continuum Analytics,Inc。
包装:mkl
消息:试用模式将在28天后过期
供应商:Continuum Analytics,Inc。
包装:mkl
消息:试用模式将在28天后过期
回溯(最近一次呼叫最后一次):
文件“S:\laszlo\gridsearch\u largearray.py”,第33行,在
main()
文件“S:\laszlo\gridsearch\u largearray.py”,第28行,在main中
gs.fit(X_系列、y_系列)
文件“C:\Anaconda\lib\site packages\sklearn\grid\u search.py”,第597行,fit
返回自拟合(X,y,参数网格(自参数网格))
文件“C:\Anaconda\lib\site packages\sklearn\grid\u search.py”,第379行,in\u fit
对于参数_iterable中的参数
文件“C:\Anaconda\lib\site packages\sklearn\externals\joblib\parallel.py”,第651行,在调用中__
self.retrieve()
文件“C:\Anaconda\lib\site packages\sklearn\externals\joblib\parallel.py”,第503行,检索
self.\u output.append(job.get())
get中第558行的文件“C:\Anaconda\lib\multiprocessing\pool.py”
提升自我价值
struct.error:整数超出“i”格式代码的范围

编辑:
ogrisel
的答案与scikit-learn-0.15.0b1的手动内存映射不起作用。别忘了一次只运行一个脚本,否则您仍然可能会耗尽内存并有太多线程。(在CSV中,12.5 GB大小的数据需要约60 GB的运行空间,有8个线程。)

作为一种解决方法,您可以尝试显式地手动映射数据

编辑#1:以下是重要部分:

from sklearn.externals import joblib

joblib.dump(X_train, some_filename)
X_train = joblib.load(some_filename, mmap_mode='r+')
然后将此memmap数据传递到scikit learn 0.15+下的
GridSearchCV

编辑#2:此外:如果使用32位版本的Anaconda,则每个python进程的内存限制为2GB,这也会限制内存

我刚刚在Python 3.4下找到了一个for
numpy.save
,但即使修复了,对mmap的后续调用也会失败,原因是:

OSError: [WinError 8] Not enough storage is available to process this command
因此,请使用64位版本的Python(以Anaconda为例,目前numpy/scipy/scikit learn==0.15.0b1没有其他64位软件包)


编辑#3:我发现另一个问题可能会导致windows下的内存过度使用:当前
joblib。默认情况下,并行
内存将输入数据映射到
mmap#u mode='c'
:此写时复制设置似乎会导致windows耗尽分页文件,有时会触发“[错误1455]分页文件太小,此操作无法完成“错误”。设置
mmap\u mode='r'
mmap\u mode='r+'
不会触发该问题。我将运行测试,看看是否可以在下一版本的joblib中更改默认模式。

您可以发布您正在使用的Anaconda版本吗?如果可能,发布parallel.py和pool.py。可能是您创建了太多并行进程。无论如何,这种东西更适合作为bug报告。你能发布你正在使用的python和scikit版本吗?在官方存储库中查看该特定版本的代码会很有帮助。您不需要发布文件。这听起来像是joblib中的一个严重错误,但是我无法通过运行以下脚本来复制它:您能否提供一个包含随机数据的独立脚本,以触发您机器上的错误?你有哪个numpy版本?因为你在windows上,不要忘了在调用scikit learn的部分(涉及
n\u jobs=8
)中添加
if.\uu name.\uuu=''.\uu main.\uu':
块,以保护该部分。仅供参考,我可以在一个大的windows框上运行我之前的要点中的代码,而不会崩溃。@ogrisel这解决了这个问题,从某种意义上说,原来的崩溃已经避免了。然而,该系统的工作组