Dictionary 创建键值对的更快方法

Dictionary 创建键值对的更快方法,dictionary,go,Dictionary,Go,我想创建从键字符串到值字符串[]的映射。我读了一个文件: gloveEmbeddings := make(map[string][]string) f, _ := ioutil.ReadFile("./glove.840B.300d.txt") 该文件的格式如下: key0 val0_index0 val0_index1 val0_index2 val0_index3 key1 val1_index0 val1_index1 val1_index2 val1_in

我想创建从键字符串到值字符串[]的映射。我读了一个文件:

  gloveEmbeddings := make(map[string][]string)

  f, _ := ioutil.ReadFile("./glove.840B.300d.txt")
该文件的格式如下:

key0 val0_index0 val0_index1 val0_index2 val0_index3
key1 val1_index0 val1_index1 val1_index2 val1_index3
...
有两种分离,新线和空间

首先,我创建新行的拆分:

newlineSplit := strings.Split(string(f), "\n")
然后我用空格分割每一行,并将结果数组中的第一个值作为键,其余部分的切片作为值:

  for i := 0; i < len(newlineSplit); i++ {
    spaceSplit := strings.Split(newlineSplit[i], " ")
    gloveEmbeddings[spaceSplit[0]] = spaceSplit[1:]
  }

  fmt.Println(gloveEmbeddings)

但是计数停止打印为219万次。

循环实际上运行得很快,即使是使用ioutil.ReadFile的原始版本。花了很长时间的是fmt.PrintlngloveEmbeddings,它只用于调试。一次读取所有文件,一次读取一行文件需要相同的时间,在我的机器上大约需要42-44秒。

不要一次读取所有文件。用于逐行读取。或使用a。这些行有多长?您的机器有多少RAM?即使您现在正在使用缓冲,您仍然保留内存中的所有数据。你一定要这么做吗?您需要该映射的确切目的是什么?我认为该文件包含索引而不是字符串,因此您可能希望在读取字符串时将其解析为int64或其他格式。这将大大减少对内存的影响。是的,IO操作应该是最耗时的操作。还有关于219万之后停止打印的问题……可能是因为控制台内存不足。不,这不是原因。原因是文本文件中有219万个条目,我们每10000次迭代打印一次。
  gloveEmbeddings := make(map[string][]string)

  f, _ := os.Open("./glove.840B.300d.txt")

  scanner := bufio.NewScanner(f)
  count := 0
  for scanner.Scan() {
    spaceSplit := strings.Split(scanner.Text(), " ")
    gloveEmbeddings[spaceSplit[0]] = spaceSplit[1:]
    if count % 10000 == 0 {
      fmt.Println(count)
    }
    count++
  }