easyLambda 是使用 C++ 和 MPI 进行数据处理的工具。easyLambda 具有模块化,并行,基于数据流,Map/Reduce 等特性。

easyLambda 也称为 ezl,项目最初目的是为了提供一个用 C++ 处理数据的标准方法。

设计目的:可组合,界面简单,解耦IO,数据格式,从算术逻辑并行代码,更少的样板代码,任何会 C 语言的人都可以理解使用。easyLambda 也达到了这些目的,还包括类型安全数据流管道,map/reduce 等等类似的操作,MPI 并行,一个简单且强大的ExpressionBuilder 接口,支持现代化 C++ 特性。

ezl 可以帮你完成数据处理任务,编写 post-processors 模拟结果,机器学习算法迭代,常规列表数据处理或者任意 数据/任务 并行代码。ezl 可以结合 openCV/Dlib/thrust 等库一起使用。

要求:

  • c++14 compliant compiler and MPI (mpic++/mpicxx and mpirun)
    • Works with gcc-5.1 or later and clang-3.5 or later.
    • Tested with gcc-5.3, gcc-6.0(dev. branch), Apple LLVM version 7.0.0 (clang-700.0.72).
  • boost::mpi, boost::serialization tested with 5.8 and 6.0.

并行化:

prll

benchmarks

数据流:

dataflow

Example wordcount

#include <string>

#include <boost/mpi.hpp>

#include "ezl/ezl.hpp"
#include "ezl/algorithms/readFile.hpp"
#include "ezl/algorithms/reduces.hpp"

int main(int argc, char* argv[]) {
  using std::string;
  using ezl::readFile;
  boost::mpi::environment env(argc, argv);

  ezl::rise(readFile<string>(argv[1]).rowSeparator('s').colSeparator(""))
    .reduce<1>(ezl::count(), 0).dump()
    .run();
  return 0;
}

Example pi (Monte-Carlo)

ezl::rise(ezl::kick(10000)) // 10000 trials in total
  .map([] { 
    auto x = rand01();
    auto y = rand01();
    return x*x + y*y; 
  })
  .filter(ezl::lt(1.))
  .reduce(ezl::count(), 0)
  .map([](int inCircleCount) { 
    return (4.0 * inCircleCount / 10000); 
  }).colsTransform().dump()
  .run();

easyLambda 遵循 Boost Software License 协议。

GitHub 地址:https://github.com/haptork/easylambda