V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
prenwang
V2EX  ›  Go 编程语言

关于 go-linq 和 RxGo, 做数据统计还是 go-linq 方便一点

  •  
  •   prenwang · 2020-08-23 12:38:19 +08:00 · 2198 次点击
    这是一个创建于 1557 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这两个库都不错, 开发活跃, go-linq 来自 Google 员工, RxGo 来自 ReactiveX 官方, 背景都不错.

    ReactiveX 算是 linq 的扩展, RxGo 的覆盖场景要更广泛一点, 扩展性更强, 并发的使用也很便捷, 当然复杂性也增加了不少,

    RxGo 的 GroupBY 设计的很奇怪, 分组的 KEY 和分组的数量还要另外计算:

    	type Cat struct {
    		Name  string
    		Value string
    	}
    	items := []Cat{
    		{Name: "a", Value: "asdf"},
    		{Name: "a", Value: "sdf432"},
    		{Name: "b", Value: "sdf342"},
    		{Name: "b", Value: "vvvv"},
    		{Name: "c", Value: "ccc"},
    	}
    	keys, _ := rxgo.Just(items)().Map(func(_ context.Context, i interface{}) (interface{}, error) {
    		return i.(Cat).Name, nil
    	}).Distinct(func(_ context.Context, i interface{}) (interface{}, error) {
    		return i, nil
    	}).ToSlice(0)
    
    	list := &arraylist.List{}
    	list.Add(keys...)
    
    	observable := rxgo.Just(items)().GroupBy(len(keys), func(item rxgo.Item) int {
    		return list.IndexOf(item.V.(Cat).Name)
    	}, rxgo.WithBufferedChannel(5))
    
    	for i := range observable.Observe() {
    		fmt.Println("New observable:")
    
    		for i := range i.V.(rxgo.Observable).Observe() {
    			fmt.Printf("item: %v\n", i.V)
    		}
    	}
    

    RxJava 和 RxJs 等还是直接根据一个属性分组, go-linq 也是如此, 这一点感觉不太喜欢.

    RxGo 是基于流处理, 不提供直接的排序函数, 需要自己去扩展.

    RxGo 有完善的错误处理机制, go-linq 缺, 但也因此, 对过程和结果处理显得繁琐,

    在纯粹的数据集统计上 go-linq 要更方便一点, 函数的使用更便捷一点, 保证数据集合的严谨前提下, 使用 go-linq 足够.

    RxGo 可以应用到更复杂的场景去.

    petelin
        1
    petelin  
       2020-08-23 12:40:13 +08:00 via iPhone
    没有范性都太丑了 等着出来了在玩
    prenwang
        2
    prenwang  
    OP
       2020-08-23 12:45:33 +08:00
    如果你要好看 go-linq 有伪泛型, 比真正的泛型还好看, 性能减弱 5-10 倍(仍然可以接受, 比 python 还是快很多对吧)

    squares := []int{}

    Range(1, 10).SelectT(func(x int) int { return x * x } ). ToSlice(&squares)


    go-linq 非泛型

    squares := []int{}

    Range(1, 10).Select( func(x interface{}) interface{} { return x.(int) * x.(int) } ).ToSlice(&squares)
    prenwang
        3
    prenwang  
    OP
       2020-08-23 12:50:10 +08:00
    linq 的场景, 对泛型确实很期待, 超大数据集, 应该提升不止 10 倍性能

    squares := []int{}

    Range(1, 10).SelectT(func(type int)(x int) int { return x * x } ). ToSlice(&squares)
    liprais
        4
    liprais  
       2020-08-23 12:56:44 +08:00 via iPhone
    数据放不进内存当场歇菜,10 倍性能是脑补的么
    jamiesun
        5
    jamiesun  
       2020-08-23 13:04:52 +08:00 via iPhone
    仅针对内存中处理的数据集而言
    jamiesun
        6
    jamiesun  
       2020-08-23 13:06:57 +08:00 via iPhone
    就算是分布式 map reduce,节点不都是在内存中处理部分数据集吗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4420 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 10:13 · PVG 18:13 · LAX 02:13 · JFK 05:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.