Добрый день. Написал программу, которая тупо открывает csv файлы и читает их. Размер файлов около 100 МБ. Файлы полностью считываются, сортируются и закрываются. Проблема в том, что программа в какой-то момент заняла около 1200 МБ, после этого я остановил работу программы.
package main
import (
	"bufio"
	"encoding/csv"
	"fmt"
	"os"
	"path/filepath"
	"log"
	"sort"
)
type FInfo struct {
	path string
	FileInfo os.FileInfo
}
type FInfoSlice []FInfo
func (slice FInfoSlice) Len() int {
	return len(slice)
}
func (slice FInfoSlice) Less(i, j int) bool {
	return slice[j].FileInfo.ModTime().Before(slice[i].FileInfo.ModTime())
}
func (slice FInfoSlice) Swap(i, j int) {
	slice[i], slice[j] = slice[j], slice[i]
}
func getListFiles(paths []string) []string {
	count_paths := len(paths)
	info := make(FInfoSlice, count_paths)
	for index, path := range paths {
		info[index].FileInfo, _ = os.Stat(path)
		info[index].path = path
	}
	sort.Sort(info)
	new_paths := paths
	for index, f_struct := range info {
		new_paths[index] = f_struct.path
	}
	return new_paths
}
type csvSlice [][]string
func (c csvSlice) Len() int {
	return len(c)
}
func (c csvSlice) Swap(i, j int) {
	c[i], c[j] = c[j], c[i]
}
func (c csvSlice) Less(i, j int) bool {
	return c[i][4] < c[j][4]
}
func readCsv(path string) [][]string {
	file, err := os.Open(path)
	defer file.Close()
	if err != nil {
		log.Fatal(err)
	}
	reader := csv.NewReader(bufio.NewReader(file))
	reader.Comma = ';'
	values, _ := reader.ReadAll()
	sort_values := values[1:]
	sort.Sort(csvSlice(sort_values))
	return sort_values
}
func in(name string, info map[string]*csv.Writer) bool {
	for i_name, _ := range info {
		if i_name == name {
			return true
		}
	}
	return false
}
func writeCsvFile(path string) {
	for range readCsv(path) {
		continue
	}
}
func main() {
	pattern_out := fmt.Sprintf("%s/*.csv", os.Args[2])
	old_files, _ := filepath.Glob(pattern_out)
	for _, path := range old_files {
		os.Remove(path)
	}
	pattern_in := fmt.Sprintf("%s/*.csv", os.Args[1])
	paths, err := filepath.Glob(pattern_in)
	if err != nil {
		log.Fatal(err)
	}
	f_info := getListFiles(paths)
	for _, path := range f_info {
		writeCsvFile(path)
	}
}
Есть подозрение, что как-то не так работает уборка мусора или я что-то делаю не так.
go version go1.6 linux/386






