一年后,我终于得到了我想要的东西。
1)用你想在不同的cpu上做的事情创建一个函数。在这里,它只是使用!
神奇的 ipython 命令从 bash 调用脚本。我想它可以与该call()
功能一起使用。
def my_func(my_file):
!python pgm.py {my_file}
{}
使用时不要忘记!
另请注意, to 的路径my_file
应该是绝对的,因为集群是您启动笔记本的位置(在执行jupyter notebook
or时ipython notebook
),不一定是您所在的位置。
2)使用您想要的 CPU 数量启动您的 ipython notebook 集群。等待 2s 并执行以下单元格:
from IPython import parallel
rc = parallel.Client()
view = rc.load_balanced_view()
3)获取要处理的文件列表:
files = list_of_files
4)将您的功能与所有文件异步映射到view
您刚刚创建的引擎。(不确定措辞)。
r = view.map_async(my_func, files)
当它运行时,您可以在笔记本上做其他事情(它在“后台”运行!)。您也可以调用r.wait_interactive()
它以交互方式枚举已处理的文件数、到目前为止花费的时间以及剩余的文件数。这将阻止您运行其他单元格(但您可以中断它)。
如果你的文件比引擎多,不用担心,一旦引擎完成 1 个文件,它们就会被处理。
希望这对其他人有帮助!
本教程可能会有所帮助:
http://nbviewer.ipython.org/github/minrk/IPython-parallel-tutorial/blob/master/Index.ipynb
另请注意,我仍然有IPython 2.3.1
,我不知道它是否改变了Jupyter
。
编辑:仍然适用于 Jupyter,请参阅此处了解您可能遇到的差异和潜在问题
请注意,如果您在函数中使用外部库,则需要在不同的引擎上导入它们:
%px import numpy as np
或者
%%px
import numpy as np
import pandas as pd
与变量和其他函数相同,您需要将它们推送到引擎名称空间:
rc[:].push(dict(
foo=foo,
bar=bar))