beego 交叉编译
linux
GOOS=linux GOARCH=amd64 bee pack
linux
GOOS=linux GOARCH=amd64 bee pack
package main
import (
"encoding/base64"
"fmt"
"io"
"os"
"regexp"
"github.com/imroc/biu"
)
func main() {
s := `二进制字符串`
s = strings.Replace(s, "_", "1", -1)
arr := regexp.MustCompile("\\d+").FindAllString(s, -1)
var r = make([]byte, 0, len(arr))
for _, x := range arr {
var a byte
biu.ReadBinaryString(x, &a)
r = append(r, a)
}
wireteString, _ := base64.StdEncoding.DecodeString(string(r))
// fmt.Println(wireteString)
f, err := os.Create("/Users/jiayx/workspace/jiayx/go/src/lean/a.tar.gz") //创建文件
if err != nil {
panic(err)
}
n, _ := io.WriteString(f, string(wireteString))
println("写入文件成功, 长度:", n)
}
一直以来我都是看到新系统就不能忍。。想在第一时间更新,今天 macOS 正式版推送了,就立马更新了一波。
说一说遇到的问题吧。
更新之后,执行 go build
会提示错误
fatal error: MSpanList_Insert
我还以为我昨天把代码改坏了。。。一番查证之后,发现是由于我目前的 golang 1.6 不支持 macOS,更新 golang 到1.7.1之后问题解决。
还有更新 golang 过程中遇到的问题。
更新 golang 就少不了 brew 的帮忙,在我执行 brew upgrade go
的时候注意到命令行提示:
/usr/local is not writable. You should change the ownership
and permissions of /usr/local back to your user account:
sudo chown -R $(whoami) /usr/local
(百度是真的不靠谱...) google 查到是因为 mac 系统升级的问题。只需要按照提示执行 sudo chown -R $(whoami) /usr/local
就 ok 了。
更新: homebrew 更新了,不再需要 修改 /usr/local
的权限了
这是目前我发现的升级 macOS Sierra 遇到的问题,之后遇到会继续更新。
前期build数据使用php脚本,25000条数据(以下时间均为插入25000条测得)大概要4分钟
为了加快build速度,决定采用并发支持比较好的golang来做
第一个demo使用了官方给出的操作示例,单条循环插入
for _, item := range *items {
_, err = client.Index().
Index("twitter").
Type("tweet").
BodyJson(item).
Do()
}
改写之后,只开一个线程的话时间缩短到1分30秒
开四个或四个以上线程,时间大约30-40秒
这样做还是不够理想,毕竟我们是google级别的工程师^_^(龙哥说的~~)
然后寻找改进方法。
龙哥提到有一个Bulk方法可以批量插入数据。
一番研究之后,代码片段如下:
bulkService := client.Bulk().Index("test").Type("test")
for _, item := range *items {
fmt.Println("[thread", i, "] ", item.UniqueId)
r := elastic.NewBulkIndexRequest().Index("test").Type("test").Doc(item)
bulkService.Add(r)
// 大于阀值先存一波
if bulkService.NumberOfActions() > MaxBulkActions {
bulkService.Do()
}
}
// 剩余的存一波
if bulkService.NumberOfActions() > 0 {
bulkService.Do()
}
修改过后经测试,四线程是最优的。插入25000条数据大约只需要4秒钟。
如下:
go build -ldflags "-s -w -H=windowsgui"