[英]Python's random.sample and stack overflow
我一直在從事大型Python科學項目,並且遇到了堆棧溢出問題,該問題基本上涉及random.sample()
和multiprocessing
。 我有一個包含大量Foo
的Goo
對象,他們試圖結交朋友。 為了這樣做,他們挑p
其他Foo
屬於Goo
隨機使用random.sample()
完成后,程序將停止。
它是這樣的:
foo.py
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
並使用Jupyter運行:
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()
這會引發MaybeEncodingError: Error sending result: '[<goo.Goo object at 0x0000003B15E60A90>]'. Reason: 'RecursionError('maximum recursion depth exceeded while pickling an object',)'
MaybeEncodingError: Error sending result: '[<goo.Goo object at 0x0000003B15E60A90>]'. Reason: 'RecursionError('maximum recursion depth exceeded while pickling an object',)'
當它與para_list = [10, 10]
,我只能想象會出現錯誤,因為從列表中選取的列表太大時random.sample()變得太大而無法處理,這在使用多處理時會出現問題。 但是1000 Foos並不多。
有人知道替代品嗎?
謝謝你的時間!
最好,
為了使您的Goo
對象被腌制(以將其傳輸到另一個進程),必須首先對其所有Foo
進行腌制。 要腌制所有這些Foo
,必須首先腌制所有其朋友Foo
。 然后腌那些 Foo
...等等。 很可能在整個1000 Foo
都有一連串的友誼(因此,在酸洗過程中需要超過1000的堆棧深度)-但是默認遞歸限制(至少在我的Python副本上)只有1000
如果您可以將1000 Foo
作為極限,那么可能可以稍微提高遞歸極限sys.setrecursionlimit(1050)
。 如果您需要更多的東西,則需要另一種方法。 我想到的第一件事是將每個Foo
的友誼存儲為Goo
的foo_list
中的索引列表,而不是實際引用其他Foo
的引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.