Example genmaps doesn't open all files at the same time. To avoid "too many open files" error in linux.
This commit is contained in:
Binary file not shown.
@ -43,29 +43,36 @@ func main() {
|
|||||||
mkmin(&min[1], &pos[1])
|
mkmin(&min[1], &pos[1])
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open mca files
|
type regions struct {
|
||||||
var rs = make(map[[2]int]*region.Region, len(de))
|
pos [2]int
|
||||||
for _, dir := range de {
|
*region.Region
|
||||||
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
|
|
||||||
}
|
}
|
||||||
|
// 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))
|
bigPicture := image.NewRGBA(image.Rect(min[0]*512, min[1]*512, max[0]*512+512, max[1]*512+512))
|
||||||
var bigWg sync.WaitGroup
|
var bigWg sync.WaitGroup
|
||||||
// draw columns
|
// draw columns
|
||||||
for pos, r := range rs {
|
for r := range rs {
|
||||||
img := image.NewRGBA(image.Rect(0, 0, 32*16, 32*16))
|
img := image.NewRGBA(image.Rect(0, 0, 32*16, 32*16))
|
||||||
type task struct {
|
type task struct {
|
||||||
data []byte
|
data []byte
|
||||||
@ -111,7 +118,7 @@ func main() {
|
|||||||
wg.Wait()
|
wg.Wait()
|
||||||
// Save pictures
|
// Save pictures
|
||||||
bigWg.Add(1)
|
bigWg.Add(1)
|
||||||
log.Print("Draw: ", pos)
|
log.Print("Draw: ", r.pos)
|
||||||
go func(img image.Image, pos [2]int) {
|
go func(img image.Image, pos [2]int) {
|
||||||
savePng(img, fmt.Sprintf("r.%d.%d.png", pos[0], pos[1]))
|
savePng(img, fmt.Sprintf("r.%d.%d.png", pos[0], pos[1]))
|
||||||
draw.Draw(
|
draw.Draw(
|
||||||
@ -119,10 +126,10 @@ func main() {
|
|||||||
img, image.Pt(0, 0), draw.Src,
|
img, image.Pt(0, 0), draw.Src,
|
||||||
)
|
)
|
||||||
bigWg.Done()
|
bigWg.Done()
|
||||||
}(img, pos)
|
}(img, r.pos)
|
||||||
// To close mca files
|
// To close mca files
|
||||||
if err := r.Close(); err != nil {
|
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()
|
bigWg.Wait()
|
||||||
|
Reference in New Issue
Block a user