From d4153ac7a841170a5ceee47d930e97738b5a19f6 Mon Sep 17 00:00:00 2001 From: Shraddha Agrawal Date: Mon, 29 Jan 2024 21:43:02 +0530 Subject: [PATCH] attempt 9: process each chunk read into a map --- README.md | 3 +- main.go | 72 ++++++++++++++++++++++-------------------- profiles/cpu-map.prof | Bin 0 -> 26136 bytes 3 files changed, 39 insertions(+), 36 deletions(-) create mode 100644 profiles/cpu-map.prof diff --git a/README.md b/README.md index f02c094..92cac43 100644 --- a/README.md +++ b/README.md @@ -10,4 +10,5 @@ |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|[7812da4](https://github.com/shraddhaag/1brc/commit/7812da4d0be07dd4686d5f9b9df1e93b08cd0dd1)| |7|In the city <> temperatures map, replaced the value for each key (city) to preprocessed min, max, count and sum of all temperatures instead of storing all recorded temperatures for the city.|1:39.81|-71.79|[e5213a8](https://github.com/shraddhaag/1brc/commit/e5213a836b17bec0a858474a11f07c902e724bba)| -|8|Use producer consumer pattern to read file in chunks and process the chunks in parallel.|1:43.82|+14.01|| \ No newline at end of file +|8|Use producer consumer pattern to read file in chunks and process the chunks in parallel.|1:43.82|+14.01|[067f2a4](https://github.com/shraddhaag/1brc/commit/067f2a44c0d6b3bb7cc073639364f733bce09e3e)| +|9|Reduce memory allocation by processing each read chunk into a map. Result channel now can collate the smaller processed chunk maps.|0:28.544|-75.286|| \ No newline at end of file diff --git a/main.go b/main.go index 96fa637..7d66a20 100644 --- a/main.go +++ b/main.go @@ -104,7 +104,7 @@ func readFileLineByLineIntoAMap(filepath string) (map[string]cityTemperatureInfo defer file.Close() mapOfTemp := make(map[string]cityTemperatureInfo) - resultStream := make(chan []string, 100) + resultStream := make(chan map[string]cityTemperatureInfo, 10) chunkStream := make(chan []byte, 15) chunkSize := 64 * 1024 * 1024 var wg sync.WaitGroup @@ -155,31 +155,20 @@ func readFileLineByLineIntoAMap(filepath string) (map[string]cityTemperatureInfo // process all city temperatures derived after processing the file chunks for t := range resultStream { - for _, text := range t { - index := strings.Index(text, ";") - if index == -1 { - continue - } - city := text[:index] - temp := convertStringToInt64(text[index+1:]) + for city, tempInfo := range t { if val, ok := mapOfTemp[city]; ok { - val.count++ - val.sum += temp - if temp < val.min { - val.min = temp + val.count += tempInfo.count + val.sum += tempInfo.sum + if tempInfo.min < val.min { + val.min = tempInfo.min } - if temp > val.max { - val.max = temp + if tempInfo.max > val.max { + val.max = tempInfo.max } mapOfTemp[city] = val } else { - mapOfTemp[city] = cityTemperatureInfo{ - count: 1, - min: temp, - max: temp, - sum: temp, - } + mapOfTemp[city] = tempInfo } } } @@ -193,32 +182,45 @@ func convertStringToInt64(input string) int64 { return output } -func processReadChunk(buf []byte, resultStream chan<- []string) { - var count int +func processReadChunk(buf []byte, resultStream chan<- map[string]cityTemperatureInfo) { var stringsBuilder strings.Builder - toSend := make([]string, 100) + toSend := make(map[string]cityTemperatureInfo) + var city string for _, char := range buf { - if char == '\n' { - if stringsBuilder.Len() != 0 { - toSend[count] = stringsBuilder.String() + if char == ';' { + city = stringsBuilder.String() + stringsBuilder.Reset() + } else if char == '\n' { + if stringsBuilder.Len() != 0 && len(city) != 0 { + temp := convertStringToInt64(stringsBuilder.String()) stringsBuilder.Reset() - count++ - if count == 100 { - count = 0 - localCopy := make([]string, 100) - copy(localCopy, toSend) - resultStream <- localCopy + if val, ok := toSend[city]; ok { + val.count++ + val.sum += temp + if temp < val.min { + val.min = temp + } + + if temp > val.max { + val.max = temp + } + toSend[city] = val + } else { + toSend[city] = cityTemperatureInfo{ + count: 1, + min: temp, + max: temp, + sum: temp, + } } } } else { stringsBuilder.WriteByte(char) } } - if count != 0 { - resultStream <- toSend[:count] - } + resultStream <- toSend } func round(x float64) float64 { diff --git a/profiles/cpu-map.prof b/profiles/cpu-map.prof new file mode 100644 index 0000000000000000000000000000000000000000..76d0c4bdd658326b4fbdfcc7647c1201e67059e5 GIT binary patch literal 26136 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 literal 0 HcmV?d00001