簡體   English   中英

Python的random.sample和堆棧溢出

[英]Python's random.sample and stack overflow

我一直在從事大型Python科學項目,並且遇到了堆棧溢出問題,該問題基本上涉及random.sample()multiprocessing 我有一個包含大量FooGoo對象,他們試圖結交朋友。 為了這樣做,他們挑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的友誼存儲為Goofoo_list中的索引列表,而不是實際引用其他Foo的引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM