首页 > 解决方案 > 给出 OSError 的 Dask 包图:[Errno 24] 打开的文件太多

问题描述

我正在尝试使用我的 8 个内核在本地机器上的 Dask 包上使用用户定义的函数来并行化元素计算。具体来说,该列表是G由 NetworkX 创建的图的节点列表(为简洁起见,我省略了此代码,但我总是可以包含它)。我想用这个包在包中的每个节点上运行一个NetworkX图计算,它最初是作为一个列表获得的。

该列表是使用以下方法创建的:

from dask.distributed import Client
import dask.bag as db
import networkx as nx

client = Client()

def my_func(x, G):
    ego_graph = nx.ego_graph(G, x, radius=2)
    ego_graph_ls = nx.to_edgelist(ego_graph)
    return ego_graph_ls

starting_list = ['node1', 'node2', 'node3', 'node4']
my_bag = db.from_sequence(starting_list)
result = my_bag.map(my_func, G).compute()  # G is a nx.Graph()

换句话说,对于 中的任何节点my_bag,我想并行计算整个图中该节点的边列表。

但是,当我运行此代码时,我收到以下错误(截断空间,但如果需要,我可以提供整个内容):

2019-05-09 11:00:58,566 - base_events.py - default_exception_handler - ERROR - Exception in callback BaseAsyncIOLoop._handle_events(64, 1)
handle: <Handle BaseAsyncIOLoop._handle_events(64, 1)>
Traceback (most recent call last):
  File "/Users/cj2001/.pyenv/versions/3.6.5/lib/python3.6/asyncio/events.py", line 145, in _run
    self._callback(*self._args)
  File "/Users/cj2001/.pyenv/versions/3.6.5/lib/python3.6/site-packages/tornado/platform/asyncio.py", line 122, in _handle_events
    handler_func(fileobj, events)
  File "/Users/cj2001/.pyenv/versions/3.6.5/lib/python3.6/site-packages/tornado/stack_context.py", line 300, in null_wrapper
    return fn(*args, **kwargs)
  File "/Users/cj2001/.pyenv/versions/3.6.5/lib/python3.6/site-packages/tornado/netutil.py", line 249, in accept_handler
    connection, address = sock.accept()
  File "/Users/cj2001/.pyenv/versions/3.6.5/lib/python3.6/socket.py", line 205, in accept
    fd, addr = self._accept()
OSError: [Errno 24] Too many open files

在阅读此处的 API 文档时,它表明这是可能的。我也读过类似这样的帖子,也许 Dask Delayed 是并行化循环的首选方式for(这很容易通过使用starting_list来实现)。

那么这是什么原因,OSError它可以在我的代码中修复还是我需要尝试不同的方法?

标签: networkxdask

解决方案


我重新运行上面替换最后一行:

result = my_bag.map(my_func, G).compute(scheduler='processes')

它运行没有错误。虽然它非常慢,并且状态页面上的任务流没有显示任何并行化。


推荐阅读