Добрый день. Написал программу, которая тупо открывает 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