doza_and
Тут 100 Мегов минимум 100*100=10 Гигов? неужели у вас питон столько потребляет?
Именно столько и выжирает.
Смотрела банально через диспетчер задач, потребление памяти для меня не страшный момент, по этому сильно не морочилась, над замерами.
Пиковое значение потребления памяти программы на go 71 мб
Код, файла где точка входа
package main
import (
"fmt"
"infotheory/generator/utils"
"io/ioutil"
"math"
"math/rand"
"time"
)
func getRandLetter(alphabet []rune, probability []float64) rune {
num := rand.Float64()
for index, currentProb := range probability {
if currentProb > num {
return alphabet[index]
}
}
return alphabet[len(probability) - 1]
}
func GenerateString(conf *utils.Config) ([]byte, map[byte]int, time.Duration) {
start := time.Now()
resultStr := make([]byte, conf.Length)
counter := make(map[byte]int)
var letter byte
for i := int64(0); i < conf.Length; i++ {
letter = byte(getRandLetter(conf.Alphabet, conf.Probability))
resultStr[i] = letter
counter[letter]++
}
return resultStr, counter, time.Since(start)
}
func calcEntropy(conf *utils.Config) float64 {
var res float64
for _, i := range conf.Probability {
res += -i * math.Log2(i)
}
return res
}
func init() {
rand.Seed(time.Now().UnixNano())
}
func main() {
conf := utils.ConfigParser()
text, counter, spentTime := GenerateString(&conf)
fmt.Println("Сгенерированна строка длинной:", conf.Length)
fmt.Println("Потрачено времени на генерацию строки и подсчет символов:", spentTime)
fmt.Println("Энтропия равна:", calcEntropy(&conf))
fmt.Println("Количество символов:")
for key, value := range counter {
fmt.Println(string(key), value)
}
err := ioutil.WriteFile("./out.txt", text, 0755)
if err != nil {
panic(err)
}
}
Парсер конфига
package utils
import (
"fmt"
"github.com/olebedev/config"
"strconv"
"os"
"strings"
)
type Config struct {
Length int64
Alphabet []rune
Probability []float64
}
func parseProbability(conf *config.Config, result *Config) {
Probability, err := conf.String("probability")
if err != nil {
panic(err)
}
prevProb := 0.0
for _, value := range strings.Split(Probability, ",") {
i, err := strconv.ParseFloat(value, 64)
if err != nil{
panic(err)
}
prevProb += i
result.Probability = append(result.Probability, prevProb)
}
if result.Probability[len(result.Probability)-1] != 1.0 {
panic(fmt.Sprintln("Сумма вероятностей не равна 1, проверьте конфигурацию", result.Probability))
}
}
func ConfigParser() Config {
conf, err := config.ParseJsonFile("/Users/alex/Golang/src/infotheory/generator/config.json")
if err != nil {
fmt.Println("Конфигурационный файл не найден")
os.Exit(1)
}
result := new(Config)
length, err := conf.String("length")
if err != nil {
panic(err)
}
result.Length, err = strconv.ParseInt(length, 0, 64)
if err != nil {
panic(err)
}
alphabet, err := conf.String("alphabet")
if err != nil {
panic(err)
}
for _, value := range strings.Split(alphabet, ",") {
result.Alphabet = append(result.Alphabet, rune([]byte(value)[0]))
}
parseProbability(conf, result)
return *result
}