LINUX.ORG.RU

Go: ioutil.ReadAll()

 ,


0

2

Всем привет! Есть какая-то адекватная замена ioutil.ReadAll(), которая позволит увеличь производительность?

Вангую что можно, наверное, писать в какой-то буфер маленькими кусочками, но хотелось бы услышать чужой опыт.


которая позволит увеличь производительность?

Производительность чего?

urxvt ★★★★★
()

Экстрасенсы в отпуске, опиши проблему для начала.

SuoiCat
()
Ответ на: комментарий от joy4eg

Не затык, смотрю в pprof и вижу что есть два места, пока, где тратится больше всего ресурсов: ioutil.ReadAll() и regexp.MustCompile(). Соответственно я хочу понять на что их можно заменить, что бы немного ускорить.

gadzira
() автор топика
Ответ на: комментарий от Deleted

Прикрутил, немного полегче стало, но глобально прирост не сильно заметен. Но так все равно лучше да.

func main() {
    buf := bytes.NewBuffer(nil)
    f, _ := os.Open(FILE_PATH)
    defer f.Close()
    io.Copy(buf, f)           
    s := string(buf.Bytes())
...}

gadzira
() автор топика

typical_go_developers.jpeg

anonymous
()
Ответ на: комментарий от gadzira

Превратить byte[] в string - аллокация, оно создает копию данных. Да и обычно сразу с байтами проще работать.

ei-grad ★★★★★
()
Ответ на: комментарий от ei-grad

Думал на тему byte[] и написал такое:

func main() {
	f, _ := os.Open(FILE_PATH)
	defer f.Close()

	scanner := bufio.NewScanner(f)
	scanner.Split(bufio.ScanLines)

	seenBrowsers := []string{}
	uniqueBrowsers := 0
	foundUsers := ""
	users := make([]map[string]interface{}, 0)

	for scanner.Scan() {
		user := make(map[string]interface{})
		err := json.Unmarshal(scanner.Bytes(), &user)
		if err != nil {
			panic(err)
		}
		users = append(users, user)
	}
Но как тут прикрутить sync.Pool - не догоняю.

gadzira
() автор топика
Ответ на: комментарий от gadzira

А это та же самая задача? Ты правда вычитывал весь файл целиком в строку и потом из неё json'ки парсил?..

Если читать и парсить руками, то тут лучше подойдет bufio.Reader с его ReadLine.

Но вообще проще сразу взять https://golang.org/pkg/encoding/json/#Decoder.Decode. Там пример есть, из него надо только считывание токенов «[» и «]» убрать.

ei-grad ★★★★★
()
Ответ на: комментарий от ei-grad

В идеале надо определить структуру User и использовать какой-нибудь ffjson или easyjson, и скармливать туда выход bufio.Reader.ReadLine. Парсить стандартным json в map[string]interface{} - дорого.

ei-grad ★★★★★
()
Последнее исправление: ei-grad (всего исправлений: 1)
Ответ на: комментарий от ei-grad

Это в общем и есть задача, привести чужой код в чувство. Сейчас попробую с структурой сделать.

gadzira
() автор топика
Ответ на: комментарий от anonymous

Это я снес почти сразу. Этот пример почти везде есть для демонстрации перфоманса, не только на хабре.

gadzira
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.