
?FLERRY?
04.05.2017
13:17:18
Ну как-нибудь :) Я же поэтому и спросил

Илья
04.05.2017
13:20:03
https://golang.org/pkg/runtime/#GC
но это плохая практика, в любом случае

Maxim
04.05.2017
13:20:51
кстати, точно, можно руками GC запустить

Google

?FLERRY?
04.05.2017
13:21:20
О, спасибо. А то в Java такое не прокатит, там рекомендательный характер метод носит...
Может хоть здесь гк послушный
?

Maxim
04.05.2017
13:21:45
ну он тебе может не освободить данные
так что
хз-хз

?FLERRY?
04.05.2017
13:22:02
Бля... Так и тут...
Ну ладно ? Пойду думать

Mike
04.05.2017
13:22:29
пишешь на си
маленький блок
который тебе вот это сделает
и пользуешься им из го

Илья
04.05.2017
13:23:02
http://stackoverflow.com/questions/39761910/how-can-you-upload-files-as-a-stream-in-go

Google

Maxim
04.05.2017
13:23:02
вообще, кстати, не вижу проблемы в том, чтоб подождать, когда gc сам все очистит

?FLERRY?
04.05.2017
13:23:06
С другой стороны и так

Илья
04.05.2017
13:23:07
делешь буфер
и льешь через него

?FLERRY?
04.05.2017
13:23:20
У меня просто есть несколько десятков аудио, которые постоянно висят в памяти
И если хоть одно из них висит больше минуты-две, это уже очередь солидная

Илья
04.05.2017
13:27:10
хз, зачем в памяти это держать, можно или чреез temp файлы качать туда, и читать потом оттуда, или, если немного упороться, стримить содержимое, но там есть мелочи, типо ContentLength не будет заполнен, и нужно будет руками делать

Ivan
04.05.2017
13:28:04
через unsafe напрямую с памятью работать

Мерлин
04.05.2017
13:28:57
Преждевременная оптимизация - зло

?FLERRY?
04.05.2017
13:34:15

Aleksandr
04.05.2017
14:01:19

?FLERRY?
04.05.2017
14:01:40
https://godoc.org/github.com/go-telegram-bot-api/telegram-bot-api#NewAudioUpload
вот этот метод
он умеет только в байты, либо в reader

Anton
04.05.2017
14:03:26
можно reader попробовать подсунуть тот, из которого ты читать будешь

Aleksandr
04.05.2017
14:03:36

Илья
04.05.2017
14:04:28
https://github.com/go-telegram-bot-api/telegram-bot-api/blob/ff42d6f7d1787d267bedf28764f69107820dd0fa/configs.go#L800

Google

Илья
04.05.2017
14:04:39
так этот "filereader", это обертка над обычным reader

?FLERRY?
04.05.2017
14:05:00
fmt.Println("Downloading " + URL + " ...")
resp, err := http.Get(url)
if err != nil {
fmt.Print(err.Error())
}
defer resp.Body.Close()
fileBytes, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Print(err.Error())
}
file = tgbotapi.FileBytes{Name: "test", Bytes: fileBytes}
return file
сейчас так

Anton
04.05.2017
14:05:48
попробуй resp.Body подсунуть в FileReader

Илья
04.05.2017
14:06:08
но порефакторить придется, тк сейчас в этом скоупе ты закроешь body

?FLERRY?
04.05.2017
14:06:08

Илья
04.05.2017
14:06:15
:)

?FLERRY?
04.05.2017
14:06:22
пофиг :В
сейчас попробую тело запихнуть

Илья
04.05.2017
14:07:52
не пофиг, если ты в defer тело уже закроешь, то читать потом будет нечего

?FLERRY?
04.05.2017
14:08:15
стопе, ведь оно все в одном методе

Aleksandr
04.05.2017
14:08:48

?FLERRY?
04.05.2017
14:09:18
угу, но может и в -1

Илья
04.05.2017
14:09:19
ну, я как понял, из vk апишечки можно метаинфу собрать до скачивания тела?

?FLERRY?
04.05.2017
14:09:31
ну названия треков и тд - да
вес - нет

Илья
04.05.2017
14:10:12
да ладно :) resp.Header.Get("Content-Length")?

?FLERRY?
04.05.2017
14:10:35
ну или так :D
так
с filereader получилось

Google

Aleksandr
04.05.2017
14:11:52
закачал?

?FLERRY?
04.05.2017
14:11:57
да
эффект тот же, но кода меньше
осталось размер ему давать, чтобы не кушал память
спасибо за помощь :) Отпишусь, как нормально сделаю...

Aleksandr
04.05.2017
14:13:26
если что у меня для тебя уже хак припасен, который я в своенм боте юзаю

?FLERRY?
04.05.2017
14:13:43
кстати, кастануть же string в int64 (байты контент-длинны в int64, требуемый либой) напрямую не получится?

Mike
04.05.2017
14:17:24
atoi ?

?FLERRY?
04.05.2017
14:18:17
точн

Maksim
04.05.2017
14:19:17
strconv.Atoi

?FLERRY?
04.05.2017
14:22:01
Офигеть, ребята. Спасибо огромное!!!
func downloadFile(URL string) (file tgbotapi.FileReader) {
fmt.Println("Downloading " + URL + " ...")
resp, err := http.Get(URL)
if err != nil {
fmt.Print(err.Error())
}
//defer resp.Body.Close()
if err != nil {
fmt.Print(err.Error())
}
contentLength, _ := strconv.Atoi(resp.Header.Get("Content-Length"))
file = tgbotapi.FileReader{Name: "test", Reader: resp.Body, Size: int64(contentLength)}
return file
}
вот так память вообще не ест
ни метра
❤️
правда надо тело придумать, как закрыть нормально :D
Да, конечно. Эта магия решила все проблемы... Спасибо!

Илья
04.05.2017
14:23:45
сделай структуру, где будет и filereader и тело, тогда, по окончании работы, ты сможешь закрыть тело

Google

Илья
04.05.2017
14:23:48
я так вижу :)

?FLERRY?
04.05.2017
14:24:05
о, точно. Подумаю...
как бы ее назвать только...
тут особо и нет фантазии :D
а, я могу передавать ее в ретурн (тело всмысле). И там закрывать. Ибо выше функция максимально привязанная к архитектуре, а эта - нет :)

i
04.05.2017
14:28:06

?FLERRY?
04.05.2017
14:28:18
будем наводить красоту походу :D

Илья
04.05.2017
14:29:01
https://golang.org/src/strconv/atoi.go?s=4530:4562#L191
кстати да :)

?FLERRY?
04.05.2017
14:29:27
тоже самое почти :D

Aleksey
04.05.2017
14:48:11
Зачем в го указатели нужны?

?FLERRY?
04.05.2017
14:49:01
допустим, копируя огромные структуры данных, можно очень потерять во времени и памяти
а если ты передаешь ссылку туда, то все супер и работа происходит с оригинальной структурой или массивом, допустим

Илья
04.05.2017
14:50:22
https://dave.cheney.net/2017/04/26/understand-go-pointers-in-less-than-800-words-or-your-money-back

Aleksey
04.05.2017
15:10:11
Зачем переменная хранит ссылку на другую переменную?

Илья
04.05.2017
15:11:44
это риторический вопрос?

Anton
04.05.2017
15:14:20