我正在尝试使用我的8个内核在本地计算机上的Dask bag上使用用户定义的函数并行化按元素计算。具体来说,该列表是由NetworkX创建的图G
的节点列表(为简洁起见,我省略了此代码,但我始终可以将其包括在内)。我想用这个包在包中的每个节点上运行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文档here时,这表明这是可能的。我还读过类似this one的帖子,也许Dask Delayed是并行化for
循环的首选方法(通过使用starting_list
可以很容易地实现此循环)。
那么OSError
的起因是什么,它可以在我的代码中修复吗?还是我需要尝试其他方法?
答案 0 :(得分:0)
我重新运行以上内容,将最后一行替换为:
result = my_bag.map(my_func, G).compute(scheduler='processes')
,它运行无误。但是,这非常慢,并且状态页面上的任务流没有显示任何并行化。