Python';s随机采样和堆栈溢出
我一直在从事一个大型Python科学项目,我遇到了一个堆栈溢出问题,它主要涉及Python';s随机采样和堆栈溢出,python,random,multiprocessing,Python,Random,Multiprocessing,我一直在从事一个大型Python科学项目,我遇到了一个堆栈溢出问题,它主要涉及random.sample()和多处理。我有一个Goo对象,其中包含大量寻求交朋友的Foo。为此,他们使用random.sample()随机选择属于Goo的potherFoo。完成后,程序停止 它是这样的: 福比 class Foo(object): def __init__(self): self.friends = [] goo.py: from foo import Foo import
random.sample()
和多处理
。我有一个Goo
对象,其中包含大量寻求交朋友的Foo
。为此,他们使用random.sample()
随机选择属于Goo
的p
otherFoo
。完成后,程序停止
它是这样的:
福比
class Foo(object):
def __init__(self):
self.friends = []
goo.py:
from foo import Foo
import random
class Goo(object):
def __init__(self, nfoo):
self.foo_list = [Foo() for i in range(nfoo)]
def sim_goo(self):
for f in self.foo_list:
candidates = random.sample(self.foo_list, 5)
f.friends = candidates
和main.py:
from goo import Goo
def do_sim(argument):
g = Goo(argument)
g.sim_goo()
return g
使用我运行:
这会引发一个MaybeEncodingError:Error发送结果:“[]”。原因:“RecursionError('酸洗对象时超过最大递归深度',)”
当它与para_list=[10,10]
一起工作时,我只能想象会出现错误,因为random.sample()太大,当它从中选取的列表太大时无法处理,这在使用多处理时会出现问题。但是1000个食物并不多
有人知道另一种选择吗
谢谢你的时间
最好是,为了对
Goo
对象进行pickle(将其传输到另一个进程),必须首先对其所有Foo
进行pickle。要腌制每个Foo
s,必须先腌制他们所有的朋友Foo
s。要腌制那些Foo
s。。。等等很可能会有一个贯穿所有1000个Foo
s的友谊链(因此在酸洗过程中需要超过1000个堆栈深度)-但是默认递归限制(至少在我的Python副本上)只有1000个
如果你能接受1000个
Foo
s作为你的限制,你可能会稍微提高递归限制-sys.setrecursionlimit(1050)
。如果你需要更多,就需要一种不同的方法。我想到的第一件事是将每个Foo
的友谊作为索引列表存储到Goo
的Foo\u列表中,而不是实际引用其他Foo
对象。以便对Goo
对象进行pickle(将其传输到另一个进程),所有的Foo
s必须首先进行酸洗。要腌制每个Foo
s,必须先腌制他们所有的朋友Foo
s。要腌制那些Foo
s。。。等等很可能会有一个贯穿所有1000个Foo
s的友谊链(因此在酸洗过程中需要超过1000个堆栈深度)-但是默认递归限制(至少在我的Python副本上)只有1000个
如果你能接受1000个Foo
s作为你的限制,你可能会稍微提高递归限制-sys.setrecursionlimit(1050)
。如果你需要更多,就需要一种不同的方法。我想到的第一件事是将每个Foo
的友谊作为索引列表存储到Goo
的Foo列表中,而不是实际引用其他Foo
s。什么是dou sim
?这是代码的核心,可能也是问题的原因。您还可以尝试增加最大递归深度!我忘了添加main.py文件,这个文件很小,但是do_sim是在哪里编程的。现在已经完成了。是的,我试图增加最大递归深度,但似乎我需要达到疯狂的高递归深度才能工作,而且随着代码的增长,这是一种短视的方法。我是一名业余程序员,我认为更具Python风格的东西应该是可行的,因此我发表了这篇文章?这是代码的核心,可能也是问题的原因。您还可以尝试增加最大递归深度!我忘了添加main.py文件,这个文件很小,但是do_sim是在哪里编程的。现在已经完成了。是的,我试图增加最大递归深度,但似乎我需要达到疯狂的高递归深度才能工作,而且随着代码的增长,这是一种短视的方法。我是一名业余程序员,我认为更具Python风格的东西应该是可行的,因此我发表了这篇文章。谢谢!可能就是这样。尽管如此,当我不使用多处理时,它的工作没有任何问题。我可以做一个“do_sim(100000)”,它只需要时间,但没有堆栈溢出。这就是我一直困惑的地方。我一定会尝试使用索引!谢谢可能就是这样。尽管如此,当我不使用多处理时,它的工作没有任何问题。我可以做一个“do_sim(100000)”,它只需要时间,但没有堆栈溢出。这就是我一直困惑的地方。我一定会尝试使用索引!
from main import do_sim
from multiprocessing import Pool
pool = Pool(processes = 2)
para_list = [1000, 1000]
result = pool.map_async(sim_goo, para_list).get()