V2版本: 改进操作界面,统一表单样式,更多工具支持批量生成,欢迎使用 到达~


文库 阅读
作者: xiaoyu 11/28 14:03:43

【Golang】生成不重复的随机数据

3## 一、踩过的坑

刚开始生成百万条数据,我用的是redis存储读取的方式验证是否有重复数据。

随着数据量的增长,这种方式实在效率低,对系统性能不友好,因此放弃Redis。

使用for循环逐个验证也不太行,当数据量到达百万条时,每生成一条数据就要执行最多100万次的循环,这显然是在浪费资源。

现在采用key:value形式,绝对是更好的方法,尤其在大规模数据生成时,只读取一次就判断出了数据是否重复。

二、更好的例子 :

package main

import (
    "bufio"
    "fmt"
    "math/rand"
    "os"
)

var uniqueMap1 = make(map[string]bool)

func main() {
    data := []string{}
    // 10000万数据
    for i := 0; i < 100000; i++ {
        data = append(data, generateRandomString())
    }
    write(data)
}

// 生成不重复的数据
func generateRandomString() string {
    charSet := "abcdefghijklmnopqrstuvwxyz0123456789"
    charSetLen := len(charSet)
    randomString := make([]byte, 5)
    result := ""
    for result == "" || uniqueMap1[result] {
        for i := range randomString {
            randomString[i] = charSet[rand.Intn(charSetLen)]
        }
        result = string(randomString)
    }
    uniqueMap1[result] = true
    return result
}

// 将[]string写入txt
func write(data []string) {
    file, err := os.Create("output.txt")
    if err != nil {
        fmt.Println("创建文件出错:", err)
        return
    }
    defer file.Close()
    writer := bufio.NewWriter(file)
    for _, line := range data {
        _, err := writer.WriteString(line + "\n")
        if err != nil {
            fmt.Println("写入出错:", err)
            return
        }
    }
    err = writer.Flush()
    if err != nil {
        fmt.Println("Error flushing writer:", err)
        return
    }
    fmt.Println("完成")
}

About

使用key:value的方式比对,验证数据是否重复,即使数据量很大,也不会影响到验证速度

Resources

发布

未发布任何资源
首页 喜欢 我的 定制
定制咨询
微信二维码
扫一扫上面的二维码,加我为朋友。
微信扫码周一至周六服务
接定制开发需求