import multiprocessing
from multiprocessing import managers
class TakerDict(dict):
"""Like a dict, but allows taking a limited number of items."""
def take(self, items=1):
"""Take the first `items` items."""
return [item for _, item in zip(range(items), self.items())]
# NOTE: add other dict methods to the tuple if you need them.
TakerProxy = managers.MakeProxyType('TakerProxy', ('take',))
managers.SyncManager.register('taker', TakerDict, TakerProxy)
if __name__ == '__main__':
manager = multiprocessing.Manager()
taker = manager.taker()
# in other processes, use e.g. taker.take(5)
您可以使用SyncManager类来注册您自己的类型。然后可以在该类型上实现方法,例如,只从dict获取有限数量的项
下面是一个让您开始的示例:
因此,要限制内存使用,您必须反复调用管理器进程以获取下一批元素。
但是,要做到这一点,dict必须支持索引(这样就可以从特定的偏移量恢复)。由于您不能访问dict中元素的底层顺序,因此最好使用列表(例如
manager.list()
)。然后在您的子流程中,请求列表的len()
,并按片索引以获得适当大小的批处理—您不需要为此注册任何代理类型。您可以迭代
keys()
以减少内存占用。你得防止钥匙被删除。否则,这里有一个具有两种不同方式的示例,可以让您迭代dict中的项。此示例中的
iteritems()
方法仅适用于创建manager对象的进程和manager对象创建的子进程。这是因为需要manager对象来创建新的代理,而其他进程无权访问它。iteritems2()
方法从其他进程工作,因为它不依赖于在这些进程中创建新代理。请注意,虽然这段代码可能更节省内存,但可能会慢得多。
iteritems()
用于列表dict。可以使用for循环。或者可以说sorted()
,它将返回排序列表中的键,然后遍历该列表并执行dict[key]
。希望能有所帮助。如果有更好的办法。一定要和我分享。我很想知道。相关问题 更多 >
编程相关推荐