From 5aa3ed132a8751e6efe5313de7f1b7d6910ee69c Mon Sep 17 00:00:00 2001 From: Shraddha Agrawal Date: Wed, 24 Jan 2024 12:52:33 +0530 Subject: [PATCH] attempt 7: use preprocessed min, max and sum temps as map value --- README.md | 3 +- main.go | 91 +++++++++++++++-------------------- profiles/cpu-int64.prof | Bin 0 -> 18400 bytes profiles/cpu-preprocess.prof | Bin 0 -> 16509 bytes 4 files changed, 40 insertions(+), 54 deletions(-) create mode 100644 profiles/cpu-int64.prof create mode 100644 profiles/cpu-preprocess.prof diff --git a/README.md b/README.md index 4a3c012..307a4bf 100644 --- a/README.md +++ b/README.md @@ -8,4 +8,5 @@ |3|Decouple reading and processing of file content. A buffered goroutine is used to communicate between the two processes.|5:22.83|+57.24|[2babf7d](https://github.com/shraddhaag/1brc/commit/2babf7dda72d92c72722b220b8b663e747075bd7)| |4|Instead of sending each line to the channel, now sending 100 lines chunked together. Also, to minimise garbage collection, not freeing up memory when resetting a slice. |3:41.76|-161.07|[b7b1781](https://github.com/shraddhaag/1brc/commit/b7b1781f58fd258a06940bd6c05eb404c8a14af6)| |5|Read file in chunks of 100 MB instead of reading line by line. |3:32.62|-9.14|[c26fea4](https://github.com/shraddhaag/1brc/commit/c26fea40019552a7e4fc1c864236f433b1b686f0)| -|6|Convert temperature from `string` to `int64`, process in `int64` and convert to `float64` at the end. |2:51.50|-41.14|| \ No newline at end of file +|6|Convert temperature from `string` to `int64`, process in `int64` and convert to `float64` at the end. |2:51.50|-41.14|[7812da4](https://github.com/shraddhaag/1brc/commit/7812da4d0be07dd4686d5f9b9df1e93b08cd0dd1)| +|7|In the value of city <> tempoeratures map, save preprocessed min, max, count and sum of all temperatures instead of saving all recorded temperatures for the city.|1:39.81|-71.79|| \ No newline at end of file diff --git a/main.go b/main.go index 55ca81d..faf8c1c 100644 --- a/main.go +++ b/main.go @@ -1,7 +1,6 @@ package main import ( - "cmp" "errors" "flag" "fmt" @@ -12,11 +11,9 @@ import ( "runtime" "runtime/pprof" "runtime/trace" + "sort" "strconv" "strings" - "sync" - - "slices" ) var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to `file`") @@ -71,66 +68,44 @@ type result struct { } func evaluate(input string) string { - // mapOfTemp, err := readFileLineByLineIntoAMap("./test_cases/measurements-rounding.txt") - // mapOfTemp, err := readFileLineByLineIntoAMap("measurements.txt") mapOfTemp, err := readFileLineByLineIntoAMap(input) if err != nil { panic(err) } - var resultArr []result - var wg sync.WaitGroup - var mx sync.Mutex - - updateResult := func(city, temp string) { - mx.Lock() - defer mx.Unlock() - - resultArr = append(resultArr, result{city, temp}) + resultArr := make([]string, len(mapOfTemp)) + var count int + for city, _ := range mapOfTemp { + resultArr[count] = city + count++ } - for city, temps := range mapOfTemp { - wg.Add(1) - go func(city string, temps []int64) { - defer wg.Done() - var min, max, avg int64 - min, max = math.MaxInt64, math.MinInt64 - - for _, temp := range temps { - if temp < min { - min = temp - } - - if temp > max { - max = temp - } - avg += temp - } - - updateResult(city, fmt.Sprintf("%.1f/%.1f/%.1f", round(float64(min)/10.0), round(float64(avg)/10.0/float64(len(temps))), round(float64(max)/10.0))) - - }(city, temps) - } - - wg.Wait() - slices.SortFunc(resultArr, func(i, j result) int { - return cmp.Compare(i.city, j.city) - }) + sort.Strings(resultArr) var stringsBuilder strings.Builder for _, i := range resultArr { - stringsBuilder.WriteString(fmt.Sprintf("%s=%s, ", i.city, i.temp)) + stringsBuilder.WriteString(fmt.Sprintf("%s=%.1f/%.1f/%.1f, ", i, + round(float64(mapOfTemp[i].min)/10.0), + round(float64(mapOfTemp[i].sum)/10.0/float64(mapOfTemp[i].count)), + round(float64(mapOfTemp[i].max)/10.0))) } return stringsBuilder.String()[:stringsBuilder.Len()-2] } -func readFileLineByLineIntoAMap(filepath string) (map[string][]int64, error) { +type cityTemperatureInfo struct { + count int64 + min int64 + max int64 + sum int64 +} + +func readFileLineByLineIntoAMap(filepath string) (map[string]cityTemperatureInfo, error) { file, err := os.Open(filepath) if err != nil { panic(err) } - mapOfTemp := make(map[string][]int64) + mapOfTemp := make(map[string]cityTemperatureInfo) chanOwner := func() <-chan []string { resultStream := make(chan []string, 100) @@ -170,21 +145,31 @@ func readFileLineByLineIntoAMap(filepath string) (map[string][]int64, error) { } city := text[:index] temp := convertStringToInt64(text[index+1:]) - if _, ok := mapOfTemp[city]; ok { - mapOfTemp[city] = append(mapOfTemp[city], temp) + if val, ok := mapOfTemp[city]; ok { + val.count++ + val.sum += temp + if temp < val.min { + val.min = temp + } + + if temp > val.max { + val.max = temp + } + mapOfTemp[city] = val } else { - mapOfTemp[city] = []int64{temp} + mapOfTemp[city] = cityTemperatureInfo{ + count: 1, + min: temp, + max: temp, + sum: temp, + } } } } + // fmt.Println(mapOfTemp) return mapOfTemp, nil } -type cityTemp struct { - city string - temp float64 -} - func convertStringToInt64(input string) int64 { input = input[:len(input)-2] + input[len(input)-1:] output, _ := strconv.ParseInt(input, 10, 64) diff --git a/profiles/cpu-int64.prof b/profiles/cpu-int64.prof new file mode 100644 index 0000000000000000000000000000000000000000..9829a0817d4986eddbe0451320f88103fa06366a GIT binary patch literal 18400 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 literal 0 HcmV?d00001