LINUX.ORG.RU

История изменений

Исправление Toxo2, (текущая версия) :

А сможете её распаралелить?

У меня на Go примерно такое же с map, только без юникода - просто байты ASCII.

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"sort"
)

type StringIntStruct struct {
	k string
	v int
}

type ArrayOfStringIntStruct []StringIntStruct

func (a ArrayOfStringIntStruct) Len() int           { return len(a) }
func (a ArrayOfStringIntStruct) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
func (a ArrayOfStringIntStruct) Less(i, j int) bool { return a[i].v > a[j].v }

func main() {
	content, err := ioutil.ReadFile("huge.txt")
	if err != nil {
		log.Fatal(err)
	}
	map_words := make(map[string]int)
	var word [1024]byte
	w := 0
	for _, c := range content {
		c = c | 32
		if c >= 'a' && c <= 'z' {
			word[w] = c
			w += 1
			continue
		}
		if w > 0 {
			map_words[string(word[0:w])] += 1
			w = 0
		}
	}
	count_words := len(map_words)
	array_words := make(ArrayOfStringIntStruct, count_words)
	w = 0
	for k, v := range map_words {
		array_words[w] = StringIntStruct{k, v}
		w++
	}
	sort.Sort(array_words)
	o, err := os.Create("out.txt")
	if err != nil {
		log.Fatal(err)
	}
	defer o.Close()
	for _, v := range array_words {
		fmt.Fprintln(o, v.v, v.k)
	}
}
Когда пытаюсь заполнять в несколько goroutine получается только хуже, потому что приходится mutex.Lock перед каждым map, и Unlock после. Если не сложно - как правильно загрузить все ядра в Go в варианте с map?

Ну, так хоть в два раза быстрее варианта на php получилось, и то слава богу. Правда в два раза медленнее вариантов на c и c++.

Исправление Toxo2, :

А сможете её распаралелить?

У меня на Go примерно такое же с map, только без юникода - просто байты ASCII.

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"sort"
)

type StringIntStruct struct {
	k string
	v int
}

type ArrayOfStringIntStruct []StringIntStruct

func (a ArrayOfStringIntStruct) Len() int           { return len(a) }
func (a ArrayOfStringIntStruct) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
func (a ArrayOfStringIntStruct) Less(i, j int) bool { return a[i].v > a[j].v }

func main() {
	content, err := ioutil.ReadFile("huge.txt")
	if err != nil {
		log.Fatal(err)
	}
	map_words := make(map[string]int)
	var word [1024]byte
	w := 0
	for _, c := range content {
		c = c | 32
		if c >= 'a' && c <= 'z' {
			word[w] = c
			w += 1
			continue
		}
		if w > 0 {
			map_words[string(word[0:w])] += 1
			w = 0
		}
	}
	count_words := len(map_words)
	array_words := make(ArrayOfStringIntStruct, count_words)
	w = 0
	for k, v := range map_words {
		array_words[w] = StringIntStruct{k, v}
		w++
	}
	sort.Sort(array_words)
	o, err := os.Create("out.txt")
	if err != nil {
		log.Fatal(err)
	}
	defer o.Close()
	for _, v := range array_words {
		fmt.Fprintln(o, v.v, v.k)
	}
}
Когда пытаюсь заполнять в несколько goroutine получается только хуже, потому что приходился mutex.Lock перед каждым map, и Unlock после. Если не сложно - как правильно загрузить все ядра в Go в варианте с map?

Ну, так хоть в два раза быстрее варианта на php получилось, и то слава богу. Правда в два раза медленнее вариантов на c и c++.

Исправление Toxo2, :

А сможете её распаралелить?

У меня на Go примерно такое же с map, только без юникода - просто байты ASCII.

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"sort"
)

type StringIntStruct struct {
	k string
	v int
}

type ArrayOfStringIntStruct []StringIntStruct

func (a ArrayOfStringIntStruct) Len() int           { return len(a) }
func (a ArrayOfStringIntStruct) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
func (a ArrayOfStringIntStruct) Less(i, j int) bool { return a[i].v > a[j].v }

func main() {
	content, err := ioutil.ReadFile("huge.txt")
	if err != nil {
		log.Fatal(err)
	}
	map_words := make(map[string]int)
	var word [1024]byte
	w := 0
	for _, c := range content {
		c = c | 32
		if c >= 'a' && c <= 'z' {
			word[w] = c
			w += 1
			continue
		}
		if w > 0 {
			map_words[string(word[0:w])] += 1
			w = 0
		}
	}
	count_words := len(map_words)
	array_words := make(ArrayOfStringIntStruct, count_words)
	w = 0
	for k, v := range map_words {
		array_words[w] = StringIntStruct{k, v}
		w++
	}
	sort.Sort(array_words)
	o, err := os.Create("out.txt")
	if err != nil {
		log.Fatal(err)
	}
	defer o.Close()
	for _, v := range array_words {
		fmt.Fprintln(o, v.v, v.k)
	}
}
Когда пытаюсь заполнять в несколько goroutine получается только хуже, потому что приходился mutex.Lock перед каждым map, и Unlock после. Если на сложно - как правильно загрузить все ядра в Go в варианте с map?

Ну, так хоть в два раза быстрее варианта на php получилось, и то слава богу. Правда в два раза медленнее вариантов на c и c++.

Исправление Toxo2, :

А сможете её распаралелить?

У меня на Go примерно такое же с map, только без юникода - просто байты ASCII.

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"sort"
)

type StringIntStruct struct {
	k string
	v int
}

type ArrayOfStringIntStruct []StringIntStruct

func (a ArrayOfStringIntStruct) Len() int           { return len(a) }
func (a ArrayOfStringIntStruct) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
func (a ArrayOfStringIntStruct) Less(i, j int) bool { return a[i].v > a[j].v }

func main() {
	content, err := ioutil.ReadFile("huge.txt")
	if err != nil {
		log.Fatal(err)
	}
	map_words := make(map[string]int)
	var word [1024]byte
	w := 0
	for _, c := range content {
		c = c | 32
		if c >= 'a' && c <= 'z' {
			word[w] = c
			w += 1
			continue
		}
		if w > 0 {
			map_words[string(word[0:w])] += 1
			w = 0
		}
	}
	count_words := len(map_words)
	array_words := make(ArrayOfStringIntStruct, count_words)
	w = 0
	for k, v := range map_words {
		array_words[w] = StringIntStruct{k, v}
		w++
	}
	sort.Sort(array_words)
	o, err := os.Create("out.txt")
	if err != nil {
		log.Fatal(err)
	}
	defer o.Close()
	for _, v := range array_words {
		fmt.Fprintln(o, v.v, v.k)
	}
}
Когда пытаюсь заполнять в несколько goroutine получается только хуже, потому что приходился mutex.Lock перед каждым map, и Ulock после. Если на сложно - как правильно загрузить все ядра в Go в варианте с map?

Ну, так хоть в два раза быстрее варианта на php получилось, и то слава богу. Правда в два раза медленнее вариантов на c и c++.

Исходная версия Toxo2, :

А сможете её распалелить?

У меня на Go примерно такое же с map, только без юникода - просто байты ASCII.

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"sort"
)

type StringIntStruct struct {
	k string
	v int
}

type ArrayOfStringIntStruct []StringIntStruct

func (a ArrayOfStringIntStruct) Len() int           { return len(a) }
func (a ArrayOfStringIntStruct) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
func (a ArrayOfStringIntStruct) Less(i, j int) bool { return a[i].v > a[j].v }

func main() {
	content, err := ioutil.ReadFile("huge.txt")
	if err != nil {
		log.Fatal(err)
	}
	map_words := make(map[string]int)
	var word [1024]byte
	w := 0
	for _, c := range content {
		c = c | 32
		if c >= 'a' && c <= 'z' {
			word[w] = c
			w += 1
			continue
		}
		if w > 0 {
			map_words[string(word[0:w])] += 1
			w = 0
		}
	}
	count_words := len(map_words)
	array_words := make(ArrayOfStringIntStruct, count_words)
	w = 0
	for k, v := range map_words {
		array_words[w] = StringIntStruct{k, v}
		w++
	}
	sort.Sort(array_words)
	o, err := os.Create("out.txt")
	if err != nil {
		log.Fatal(err)
	}
	defer o.Close()
	for _, v := range array_words {
		fmt.Fprintln(o, v.v, v.k)
	}
}
Когда пытаюсь заполнять в несколько goroutine получается только хуже, потому что приходился mutex.Lock перед каждым map, и Ulock после. Если на сложно - как правильно загрузить все ядра в Go в варианте с map?

Ну, так хоть в два раза быстрее варианта на php получилось, и то слава богу. Правда в два раза медленнее вариантов на c и c++.