Python 为什么在stringsource中出现内存错误?

Python 为什么在stringsource中出现内存错误?,python,multithreading,cython,joblib,memmap,Python,Multithreading,Cython,Joblib,Memmap,我正在尝试并行执行一个cython文件。我的代码的框架是: def build_DF_single(lo,hi,map[long,set[string]]authors\u id\u map,map[long,set[string]]authors\u org\u map, map[long,set[string]]fos\u name\u map,map[long,set[string]]publisher\u map, map[long,set[string]]year\u map,map[

我正在尝试并行执行一个cython文件。我的代码的框架是:

def build_DF_single(lo,hi,map[long,set[string]]authors\u id\u map,map[long,set[string]]authors\u org\u map,
map[long,set[string]]fos\u name\u map,map[long,set[string]]publisher\u map,
map[long,set[string]]year\u map,map[long,set[long]]reference\u map,
map[string,double]authors\u id\u prob,map[string,double]authors\u org\u prob,
map[string,double]fos\u name\u prob,map[string,double]publisher\u prob,
map[string,double]year\u prob,map[string,set[long]]authors\u id\u co,
map[string,set[long]]authors\u org\u co,map[string,set[long]]fos\u name\u co,
map[string,set[long]]publisher\u co,map[string,set[long]]year\u co,
映射[长,向量[双]]doc2vec_映射):
对于tqdm中的i(范围(lo,hi)):
行=行[i]
#数据清理
def mmap(名称):
d=joblib.load(“mmap/”+name+“.mmap”,mmap_mode=“r”)
gc.collect()
返回d
作者id\U prob=mmap(“作者id\U prob”)
作者组织问题=mmap(“作者组织问题”)
fos_name_prob=mmap(“fos_name_prob”)
publisher_prob=mmap(“publisher_prob”)
年概率=mmap(“年概率”)
作者身份证=mmap(“作者身份证”)
作者组织公司=mmap(“作者组织公司”)
fos_name_co=mmap(“fos_name_co”)
出版商公司=mmap(“出版商公司”)
年度公司=mmap(“年度公司”)
doc2vec_地图=mmap(“doc2vec_地图”)
打开(“文件”、“r”)作为f:
lines=f.readlines()#也相当大
批处理大小=int(数学单元(len(行)/n\u cpu))
结果=并行(n_作业=n_cpu,首选=“线程”,最大字节数=无)(延迟(构建单个)(
(i*批次尺寸),最小值((i+1)*批次尺寸,长度(线)),
作者id图、作者组织图、作者姓名图、出版商名称图、年份图、参考图、作者id图、作者组织图、作者姓名图、出版商名称图、出版商名称图、出版商名称图、出版商名称图、出版商名称图、年份图、作者组织图、作者公司、作者姓名图
)适用于范围内的i(n_cpu))

>作者AuthyNo.MyPoad、FooSmithEngMax、PuixelyMax、AythyMyMax、RealthyIdPro、AuthSuiOdPro、AuthSoMyOrgPROB、PuxiSeMeNeUROPRB、PuxiSeMePROB、AuthSuiPro、AuthSuiIDYCO、AuthsSoGyOCO、FuxNAMEYCO、PuxiSeLoCo、AuthyAuCO、Do2VECXMAP都是非常大的C++映射。因为我不想把它们分给不同的进程,所以我让它们成为内存映射。但是,当我的代码到达Parallel()部分时,我最终得到以下错误:

回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“buildDF.pyx”,第473行,在buildDF.build_DF中
结果=并行(n_作业=n_cpu,require=“sharedmem”,preference=“threads”,max_nbytes=None)(延迟(构建单个)(
文件“/home/zhangji/.local/lib/python2.7/site packages/joblib/parallel.py”,第1004行,在调用中__
如果self.dispatch\u一批(迭代器):
文件“/home/zhangji/.local/lib/python2.7/site packages/joblib/parallel.py”,第808行,一批发送
islice=list(itertools.islice(迭代器,大批量大小))
genexpr中第475行的文件“buildDF.pyx”
作者id图、作者组织图、作者姓名图、出版商名称图、年份图、参考图、作者id图、作者组织图、作者姓名图、出版商名称图、出版商名称图、出版商名称图、出版商名称图、出版商名称图、年份图、作者组织图、作者公司、作者姓名图
文件“stringsource”,第207行,在映射中。将映射转换为标准字符串
记忆者
谁能告诉我发生了什么事?什么是“stringsource”


谢谢!

要跟进我的评论:

<参考>代码> StReStase<代码>有点混淆。它是用Cython内部生成的Cython编写的实用代码。在这种情况下,调用公用代码将类型转换成C++(代码> > STD::MAP> 基本问题似乎是,您试图做两件相互矛盾的事情:

  • 您正在使用
    mmap
    的Python包装来加载一组大文件,而无需将它们一次全部加载到内存中

  • < >你把所有的数据转换成C++ <代码> STD::MAP< /Cord>,大概是因为你希望它更快,或者它可以在没有吉尔的情况下运行。 到
    std::map
    的转换不是一个“透明的包装器”——它是一个全新的副本。因此,所有数据都从
    mmap
    加载到内存中——因此
    MemoryError
    (我想,如果您没有提供一个完整的包装,就很难确定)


    没有明显的解决方案。要么你需要使用Python对象,这样你的代码就可以保存MMAP<代码>,或者你需要自己实现一个C++类,它可以加载数据<代码> MMAP>代码>样式,以避免转换为<代码> STD::MAP< /Cord>。< /P>欢迎任何提示,甚至随机猜测!我对Cython,我是很陌生的。mmap和多线程!Cython正在自动生成代码以将Python映射转换为std::map。内存错误正在那里发生。这被标记为“stringsource”因为它来自自动生成的Cython代码,而不是您编写的代码。我不知道您为什么会有内存错误-可能您的地图包含对自身的循环引用?仔细看-我猜您使用的是

    mmap
    ,因为您有大量的数据集。当您转换为不包含内存的数据集时,绝对不会保留此更改A+C++ <代码> STD::MAP< /COD>——它将加载整个数据集,然后内存不足。