编写一个程序,从文件读取内容到map,然后循环处理读取到的内容,却会出现重复内容

ylqjgm · 2015-05-19 16:40:10 · 1886 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2015-05-19 16:40:10 的主题,其中的信息可能已经有所发展或是发生改变。

我的流程是这样的:

从文件hash.log中读取infohash到一个map[string]int变量hashlist中,读取格式为:hashlist["infohash值"]=1,infohash是有重复值的,在读取的时候,如果遇到重复值,hashlist["infohash"]的值就会自动加1,就编程了hashlist["infohash"]=2,如果没有重复值,则默认为1

当全部读取完成后,使用range来处理map变量,将其中的每一条infohash写入数据库,使用go来并发处理,但是实际操作时却发现,虽然map变量中没有重复值,但实际操作时,却发现循环一旦开始,每次都只会重复一条数据

我的代码如下:

for {
        //e := os.Chdir("/tmp/torrent/")
        e := os.Chdir(path + "torrent/")
        if e != nil {
            //os.Mkdir("/tmp/torrent/", 0)
            os.Mkdir(path+"torrent/", 0)
        }

        s := time.Now().Format("20060102")

        f, err := os.Open(path + "hash/" + s + ".log")
        if err != nil {
            continue
        }
        defer f.Close()

        var hashList = make(map[string]int)

        bf := bufio.NewReader(f)

        for {
            line, isPrefix, err := bf.ReadLine()
            if err == io.EOF {
                break
            }
            if err != nil {
                panic(err)
            }
            if isPrefix {
                fmt.Println("Line too long")
            }

            if _, ok := hashList[string(line)]; ok {
                hashList[string(line)]++
            } else {
                hashList[string(line)] = 1
            }
        }

        ch := make([]chan int, 128)
        no := 0
        var lis = make(map[string]int)

        for k, v := range hashList {
            _, ok := lis[k]
            if ok {
                continue
            }

            if len(lis) >= 128 {
                lis = make(map[string]int)
            }

            lis[k] = v

            if no >= 128 {
                popChan(ch)
                no = 0
            }

            ch[no] = make(chan int)

            go func(chx chan int, nox int) {
                fmt.Println(k)
                n, err := pullTorrent(k, v)
                if n != 0 {
                    if err != nil {
                        fmt.Println(err)
                    }
                }

                chx <- nox
            }(ch[no], no)

            no++
        }

        time.Sleep(10 * time.Second)
    }

比如我的文件中有:

bbbb
cccc
cccc

这样的几条infohash,读取后,循环开始,第一次执行就会全部都是cccc,请问要怎么处理?


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1886 次点击  
加入收藏 微博
2 回复  |  直到 2015-05-20 05:48:34
blov
blov · #1 · 10年之前

你这里会不停地从文件读吧?

ylqjgm
ylqjgm · #2 · 10年之前
blovblov #1 回复

你这里会不停地从文件读吧?

恩,是的,不停的读取,因为infohash是不断的增加进去,所以要不停的读,现在已经解决了,把k当做参数传到go里就行了

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传