From 7f91383a1d1a701cd10ec62dd26739fb6b07fa12 Mon Sep 17 00:00:00 2001 From: Tnze Date: Sat, 13 Mar 2021 13:01:07 +0800 Subject: [PATCH] Example genmaps doesn't open all files at the same time. To avoid "too many open files" error in linux. --- examples/genmaps/colors.gob | Bin 9213 -> 9213 bytes examples/genmaps/genmaps.go | 51 ++++++++++++++++++++---------------- 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/examples/genmaps/colors.gob b/examples/genmaps/colors.gob index 1ea2afdbdee0170f01d5b45d67dc55260129ce89..72f07f80ecd036aa50bab35f48f14b7a46caefa6 100644 GIT binary patch delta 24 dcmezC{?~oNHr|B)jQ{2Uu_+M$+j!VY833>H4b}hv delta 24 ZcmezC{?~oNHr^>rjQ?Qx|Hi{s$^eqa3u^!X diff --git a/examples/genmaps/genmaps.go b/examples/genmaps/genmaps.go index ed6211b..fbdda7f 100644 --- a/examples/genmaps/genmaps.go +++ b/examples/genmaps/genmaps.go @@ -43,29 +43,36 @@ func main() { mkmin(&min[1], &pos[1]) } - // Open mca files - var rs = make(map[[2]int]*region.Region, len(de)) - for _, dir := range de { - name := dir.Name() - path := filepath.Join(*regionsFold, name) - var pos [2]int // {x, z} - if _, err := fmt.Sscanf(name, "r.%d.%d.mca", &pos[0], &pos[1]); err != nil { - log.Printf("Error parsing file name of %s: %v, ignoring", name, err) - continue - } - updateMinMax(pos) - - r, err := region.Open(path) - if err != nil { - log.Printf("Error when opening %s: %v, ignoring", name, err) - continue - } - rs[pos] = r + type regions struct { + pos [2]int + *region.Region } + // Open mca files + var rs = make(chan regions, regionWorkerNum) + go func() { + for _, dir := range de { + name := dir.Name() + path := filepath.Join(*regionsFold, name) + var pos [2]int // {x, z} + if _, err := fmt.Sscanf(name, "r.%d.%d.mca", &pos[0], &pos[1]); err != nil { + log.Printf("Error parsing file name of %s: %v, ignoring", name, err) + continue + } + updateMinMax(pos) + + r, err := region.Open(path) + if err != nil { + log.Printf("Error when opening %s: %v, ignoring", name, err) + continue + } + rs <- regions{pos: pos, Region: r} + } + close(rs) + }() bigPicture := image.NewRGBA(image.Rect(min[0]*512, min[1]*512, max[0]*512+512, max[1]*512+512)) var bigWg sync.WaitGroup // draw columns - for pos, r := range rs { + for r := range rs { img := image.NewRGBA(image.Rect(0, 0, 32*16, 32*16)) type task struct { data []byte @@ -111,7 +118,7 @@ func main() { wg.Wait() // Save pictures bigWg.Add(1) - log.Print("Draw: ", pos) + log.Print("Draw: ", r.pos) go func(img image.Image, pos [2]int) { savePng(img, fmt.Sprintf("r.%d.%d.png", pos[0], pos[1])) draw.Draw( @@ -119,10 +126,10 @@ func main() { img, image.Pt(0, 0), draw.Src, ) bigWg.Done() - }(img, pos) + }(img, r.pos) // To close mca files if err := r.Close(); err != nil { - log.Printf("Close r.%d.%d.mca error: %v", pos[0], pos[1], err) + log.Printf("Close r.%d.%d.mca error: %v", r.pos[0], r.pos[1], err) } } bigWg.Wait()