V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  praynise  ›  全部回复第 1 页 / 共 2 页
回复总数  37
1  2  
@dongyx 抱歉由于工作原因,我这边还没有抽出时间实现这个对比,后续待我完成给您后续反馈,非常感谢~
@dongyx 我用 go 实现以下,非常感谢~
@liprais pandas 加载太大的文件内存就撑不住了 orz
@dongyx 直接用 diff 的话,需要解析 diff 输出内容,会比较麻烦
2019-05-23 07:28:09 +08:00
回复了 storyicon 创建的主题 Go 编程语言 Gos: Armed Golang 💪
star 一下,交叉编译对我来说很有用,gos 方便多了。不过应该还是不支持 CGO 吧?
2019-05-17 16:51:09 +08:00
回复了 jss 创建的主题 Go 编程语言 现在上手 GO 得自己造框架吧
有个叫 go frame 的了解一下…一个大而全的框架,还包含了好多有用的功能,不管是不是 web 应用都用得上
2019-05-07 10:58:33 +08:00
回复了 imherer 创建的主题 Go 编程语言 Go 操作 Postgresql 使用 upsert 报语法错误
EXCLUDED 代表从外部来的,就是你 value 中的值。在我的例子中,EXCLUDED.what 代表就是$3。我忘了付上我得表结构了
2019-05-06 17:04:47 +08:00
回复了 imherer 创建的主题 Go 编程语言 Go 操作 Postgresql 使用 upsert 报语法错误
好使啊,以下是我测试的代码,可以正常执行

package main

import (
"database/sql"
"fmt"
_ "github.com/lib/pq"
)

func main() {
psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+
"password=%s dbname=%s sslmode=disable",
"localhost", 5432, "postgres", "postgres", "postgres")
db, err := sql.Open("postgres", psqlInfo)
if err != nil {
panic(err)
}
defer db.Close()

err = db.Ping()
if err != nil {
panic(err)
}
sql := "insert into testupsert values ($1,$2,$3) on conflict (uid) do update set total=testupsert.total+1,what = EXCLUDED.what"
_,err = db.Exec(sql,1,3,3)
if err != nil{
panic(err)
}
}
2019-01-11 13:23:09 +08:00
回复了 Fiery123 创建的主题 Go 编程语言 GO 任务队列矿建
建议配合其他定时任务工具来实现吧,go 下面有很多定时任务包
2018-07-06 21:37:13 +08:00
回复了 praynise 创建的主题 Linux 新的办公机打算上 ubuntu 了,想咨询一个各位,优麒麟如何?
主要还是针对 go 开发,python 还是没有寻找到一个好的批量离线部署方式,现在越来越多的把 python 的工具用 go 重写了…
2018-07-06 21:34:51 +08:00
回复了 praynise 创建的主题 Linux 新的办公机打算上 ubuntu 了,想咨询一个各位,优麒麟如何?
@tulongtou 因为有些依赖 C 的东东没法交叉编译…例如我这边开发很多需要用到 oracle 的驱动,这个交叉编译就会报错
2018-06-19 11:10:22 +08:00
回复了 praynise 创建的主题 Go 编程语言 请问 go 语言如何获取当前终端窗口的宽度和高度呢?
@azh7138m 这个可以,非常感谢
回来填个坑,留一个自己的优化思路和成果…
查了一些资料,使用 interface 的性能会受到较大的影响,以前的程序中使用 interface 过多,直接影响了效率
新的思路如下
首先查询出各字段类型,针对不同的字段类型直接例如 excel 库的方法插入对应类型的数据。
具体为:使用一个线程查询数据库,使用[]sql.Rawbyte 作为接收数据库数据的载体,通过一个 interface{}列表进行 scan,不断将[]sql.Rawbyte 存入通道
另外一个线程不断获取[]sql.Rawbyte 并根据字段类型进行转换。为了进一步加快速度,首先可以声明一个 map[int]func(raw sql.Rawbyte,cell *xlsx.Cell),利用字段位置直接设置好每个位置该调用什么方法
经过测试,改进后的程序执行效率大幅度提高,导出数据效率比 python 版本快了一倍,耗时缩短一半
代码说明如下:
概述:小弟的程序可以通过输入数据库类型、数据库连接字符串、执行 sql 或者含有 sql 的文件等,将数据库中的 sql 查询出来并写入 excel
性能:目前导出 25W 条数据,每行数据 5 个字段,数据库类型 oracle,驱动 goracle,excel 生成库使用 excelize,用时 1 分 33 秒;同环境使用 python3.6,数据库驱动 cx_Oracle,excel 生成库使用 pyexcelerate,同样的查询语句,用时 51s (是的…没干过 python/(ㄒoㄒ)/~~)
程序描述:为了提升执行效率,小弟使用了 goruntine,一个线程专门执行 sql 并将结果生成[]interface{}并装入通道,另外一个线程不断的从通道中取出[]interface{}并写入 excel
个人感觉可能存在的问题点:
1、golang 的数据库查询方式只能一条一条生成,同时,机制用到了反射,而不像 python 可以通过 fetchmany 一次性获取大量数据,不知道此处是否会有性能差距
2、当字段类型是 date 类型时,当字段为空时,如果不做 isZero 判断,输出到 excel 的日期零值很异常(值为-5XXXXX,显示为##########)。所以每取出一条[]interface{},都需要挨个判断类型是不是日期,如果是日期的话,是不是零值,此处可能会影响效率。而 python 没有这个问题

请各位 golang 大大给提点优化意见吧,谢谢大家
@860670496 你好,我需要使用 setSheetRow 按行插入数据,然后再按照行来统一设定本文,请问可以实现么
fabric 有 python3 版本的 fabric3,基本上和 fabric 保持了版本和功能一致(不过每次都是 python2 版本先更新,python3 版本可能要晚个一段时间,如果是小更新的话可能不同步更新)
既然想要用 paramiko,说明可以接受基于 ssh 的调用吧?那样的话,如果规模小可以选择 fabric,如果规模大一点可以选择 ansible 和 saltstack
@MeteorCat 都配置了
@nekoyaki 这个帮了我大忙了,而且还帮我发现了个不小的坑,谢谢啦,哈哈
1  2  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3434 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 23ms · UTC 10:45 · PVG 18:45 · LAX 02:45 · JFK 05:45
Developed with CodeLauncher
♥ Do have faith in what you're doing.