Python 如何pickle文件>;2 GiB,将其拆分为更小的碎片

Python 如何pickle文件>;2 GiB,将其拆分为更小的碎片,python,python-2.7,pickle,Python,Python 2.7,Pickle,我有一个大于2 GiB的分类器对象,我想对其进行pickle,但我得到了以下结果: cPickle.dump(clf,fo,protocol=cPickle.HIGHEST\u protocol) 溢出错误:无法序列化大于2 GiB的字符串 我发现这个问题也有同样的问题,有人建议 使用Python3协议4-不可接受,因为我需要使用Python2 使用pyocser导入ocdumps、ocloads中的-不可接受,因为我不能使用其他(非普通)模块 将对象拆分为字节并pickle每个片段 有没有一种

我有一个大于2 GiB的分类器对象,我想对其进行pickle,但我得到了以下结果:

cPickle.dump(clf,fo,protocol=cPickle.HIGHEST\u protocol)

溢出错误:无法序列化大于2 GiB的字符串

我发现这个问题也有同样的问题,有人建议

  • 使用Python3协议4-不可接受,因为我需要使用Python2
  • 使用pyocser导入ocdumps、ocloads中的
    -不可接受,因为我不能使用其他(非普通)模块
  • 将对象拆分为字节并pickle每个片段
  • 有没有一种方法可以使用我的分类器来实现这一点?i、 e.将其转换为字节、拆分、pickle、取消pickle、连接字节并使用分类器


    我的代码:

    from sklearn.svm import SVC 
    import cPickle
    
    def train_clf(X,y,clf_name):
        start_time = time.time()
        # after many tests, this was found to be best classifier
        clf = SVC(C = 0.01, kernel='poly')
        clf.fit(X,y)
        print 'fit done... {} seconds'.format(time.time() - start_time)
        with open(clf_name, "wb") as fo:
            cPickle.dump(clf, fo,  protocol = cPickle.HIGHEST_PROTOCOL) 
            # cPickle.HIGHEST_PROTOCOL == 2 
            # the error occurs inside the dump method
        return time.time() - start_time
    
    在此之后,我想取消勾选并使用:

    with open(clf_name, 'rb') as fo:
         clf, load_time = cPickle.load(fo), time.time()
    

    您可以使用sklearn.external.joblib,如果模型大小较大,它会自动将模型文件拆分为pickled numpy数组文件

    from sklearn.externals import joblib
    joblib.dump(clf, 'filename.pkl') 
    
    更新:sklearn将显示

    弃用警告:sklearn.externals.joblib在0.21中弃用,将在0.23中删除。请直接从joblib导入此功能,该功能可以通过以下方式安装:pip install joblib。如果在加载pickle模型时引发此警告,则可能需要使用scikit learn 0.21+重新序列化这些模型

    所以用这个代替

    import joblib
    joblib.dump(clf, 'filename.pkl') 
    
    以后可以使用以下方法取消勾选:

    clf = joblib.load('filename.pkl') 
    

    是来自scikit learn的SVC吗?@EliKorvigo是的。在代码段中添加了它为什么不使用:from sklearn.externals import joblib;joblib.dump(clf,'filename.pkl')@AlokNayak我对它不熟悉。看起来好多了,我现在就试试。我将在24小时后回来(拟合需要永远的时间)您应该为scikit学习对象使用joblib,因为它与pickle不同,单独处理numpy数组。或者像导入joblib一样简单。
    @eli korvigo joblib()这个joblib是否与“from sklearn.externals import joblib”相同?可能有一些特定于sklearn的代码修改,我不确定。顺便说一句,我看到在这个
    joblib.dump(clf,'filename.pkl')
    过程中只保存了一个文件,可以吗?每个numpy数组不应该单独保存吗?@CIsForCookies没关系,
    joblib
    在必要时保存多个文件(您可以指定压缩级别以始终保存单个文件)。@AlokNayak序列化没有什么特别之处,尽管他们为其他joblib功能(最显著的是并行化)实现了额外的包装器.