作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
如果有人在使用 Go 之前尝试过这个,请用代码来理解这个想法,我们将不胜感激。
我写了几行很慢
//这是读取csv文件
func usersFileLoader(filename string, channel chan User) {
defer close(channel)
file, err := os.Open(filename)
if err != nil {
panic(err)
}
defer file.Close()
var user User
reader := csv.NewReader(file)
for {
err := Unmarshal(reader, &user)
if err == io.EOF {
break
}
if err != nil {
panic(err)
}
channel <- user
}
}
//这是插入csv文件
func saveUser(channel <-chan User, db *sql.DB) {
stmt, err := db.Prepare(`
INSERT INTO Users( id, name, address) values ( ?, ?, ?)`)
if err != nil {
log.Fatal(err)
}
for usr := range channel {
_, err := stmt.Exec(
usr.ID,
usr.Name,
usr.Address,
)
if err != nil {
log.Fatal(err)
}
}
}
//这里是用户的结构
type User struct {
ID int `csv:"id"`
Name int `csv:"name"`
Address int `csv:"address"`
}
//这是我的主要功能
func main() {
db := DBconnect(ConnectionString(dbConfig()))
channel := make(chan User)
go usersFileLoader("../user.csv", channel)
saveUser(channel, db)
defer db.Close()
}
//这段代码有效,但对我来说很慢。分享你的想法和想法
最佳答案
我不会尝试使用 Go 的内置标准库函数将非常大的 CSV 文件加载到 MySQL 中(当然,除非您只是想了解它们的工作原理)。
为了获得最佳性能,我会简单地使用 MySQL's built in LOAD DATA INFILE
功能。
例如:
result, err := db.Exec("LOAD DATA INFILE ?", filename)
if err != nil {
log.Fatal(err)
}
log.Printf("%d rows inserted\n", result.RowsAffected())
如果您以前没有使用过 LOAD DATA INFILE,请仔细注意有关 LOCAL 的文档。根据您的服务器配置和权限,您可能需要改用 LOAD DATA LOCAL INFILE。 (例如,如果您打算使用 Docker 容器,则绝对需要使用 LOCAL。)
关于go - 如何将巨大的 csv 数据(4GB)转储到 mysql 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50166594/
我正在为我的应用程序使用 Tank-Auth。我唯一的问题是激活和重置帐户密码。 用于登录、注册、注销;我对这些代码没有问题; $route['login'] = "/auth/login"; $ro
我是一名优秀的程序员,十分优秀!