R中针对“企业”任务的并行计算的几点注意事项

并行或分布式计算本身并不是一件容易的事。 开发环境均应提供支持,DS专家应具有进行并行计算的技能,并且应将任务简化为可以分成几部分的形式(如果存在)。 但是,如果您拥有至少一个多核处理器(现在几乎每个人都拥有),并根据阿曼定律确定的理论加速度极限进行了调整,那么采用一种有效的方法,您可以极大地加快单线程R解决问题的速度。 但是,在某些情况下,甚至可以绕开它。


它是以前出版物的延续。


典型方法


通常,当分析师(DS专家,开发人员或为您自己选择任何合适的名称)试图加速单台计算机上的任务并开始从单线程模式转移到多线程模式时,他将以模板方式进行。 parApplyforeach\%dopar%等 您可以紧凑而清晰地看到它,例如,在这里: “ R中的并行” 。 3个步骤:


  1. 使core-1线程
  2. 使用foreach运行
  3. 收集答案并获得结果。

对于占用100%CPU且不要求传输大量输入信息的典型计算任务,这是正确的方法。 需要注意的重点是在线程内提供日志记录,以便能够控制进程。 如果没有日志记录,即使没有仪器,飞行也将继续进行。


对于“企业”任务,将它们并行化时,会出现许多其他方法上的困难,这些困难会大大降低上述简单方法的影响:


  • 流上的负载可能严重不平衡;
  • 只需几次尖锐的突发操作就可以破坏单个任务中的CPU性能要求。
  • 每个单独的计算可能需要大量的内存来输入和输出同样大小的结果;
  • 作为单独任务的一部分,在计算,使用磁盘和查询外部系统之间可能会混合使用。

这是一个完全典型的场景,在此过程中,您需要获得大量的工作作为输入,从磁盘读取数据,从数据库中提取一大块,要求外部系统并等待它们的回答(经典-REST API请求),然后将N返回给父进程结果是兆字节。


通过用户,位置,文档,IP地址,日期等Map-reduce (自己添加)。 在最可悲的情况下,并行执行可能比单线程执行的时间更长。 内存不足问题也可能发生。 全部都消失了吗? 一点也不。


替代方式


考虑一种从根本上改善这种状况的方法。 同时,我们不会忘记我们生活在一个完整的动物园框架内。 *nix上的生产电路,Win * nix \ MacOS上的DS笔记本电脑,但是有必要在所有地方统一工作。


  1. 一个微任务:接收用户输入,请求数据库,通过REST请求2个外部IC,从磁盘下载并解析目录,执行计算,将结果转储到disk \ database。 用户,例如10^6
  2. 我们转向使用future软件包和通用doFuture适配器。
  3. 如果在单独的任务中需要少量的处理器时间(我们正在等待第三方系统的答复),那么doFuture允许您从拆分切换在一行中拆分为单独的进程 (您可以在htop *nix中看到启动参数) 。
  4. 这些过程可以创建的比核心更多。 由于大多数情况下单个进程都处于待机模式,因此不会发生任何故障。 但是,有必要根据典型处理过程的专题图在实验上选择最佳的过程数。

结果-原始任务快了很多倍。 加速可能甚至大于可用内核的数量。
没有自觉的代码,因为该出版物的主要任务是共享该方法和一系列出色的future软件包。


聚苯乙烯


还有一些细微差别也需要追溯:


  • 每个进程都会消耗内存,包括接收和返回的数据。 进程数量的增加将使可用RAM的需求成倍增加。
  • doFuture使用“魔术”来自动确定传递到进程的变量和数据包的组成,但是您不应该让一切自行进行,最好检查一下。
  • 在进程中,使用rm显式的gc控制和显式的变量删除将不会受到损害。 这不是万能药,可能无法使用 ,但是明确指出已删除的对象会有所帮助。
  • 计算完成后,调用plan(sequential) 。 这将关闭所有进程并释放它们占用的内存。
  • 如果需要将大量数据传输到进程,请考虑使用外部存储(磁盘,数据库)。 不要忘记描述符无法传输,必须在流程本身内部打开源。

以前的出版物- “企业公司的业务流程:投机与现实。 我们用R“阐明了

Source: https://habr.com/ru/post/zh-CN462469/


All Articles