Maxim
кстати, точно, можно руками GC запустить
dev_sheep
О, спасибо. А то в Java такое не прокатит, там рекомендательный характер метод носит...
dev_sheep
Может хоть здесь гк послушный
dev_sheep
😂
Maxim
ну он тебе может не освободить данные
Maxim
так что
Maxim
хз-хз
dev_sheep
Бля... Так и тут...
dev_sheep
Ну ладно 😁 Пойду думать
Mike
пишешь на си
Mike
маленький блок
Mike
который тебе вот это сделает
Mike
и пользуешься им из го
Илья
http://stackoverflow.com/questions/39761910/how-can-you-upload-files-as-a-stream-in-go
Maxim
вообще, кстати, не вижу проблемы в том, чтоб подождать, когда gc сам все очистит
dev_sheep
С другой стороны и так
Илья
делешь буфер
Илья
и льешь через него
dev_sheep
У меня просто есть несколько десятков аудио, которые постоянно висят в памяти
dev_sheep
И если хоть одно из них висит больше минуты-две, это уже очередь солидная
Илья
хз, зачем в памяти это держать, можно или чреез temp файлы качать туда, и читать потом оттуда, или, если немного упороться, стримить содержимое, но там есть мелочи, типо ContentLength не будет заполнен, и нужно будет руками делать
Ivan
через unsafe напрямую с памятью работать
Мерль
Преждевременная оптимизация - зло
Vlad
dev_sheep
Aleksandr
dev_sheep
https://godoc.org/github.com/go-telegram-bot-api/telegram-bot-api#NewAudioUpload
dev_sheep
вот этот метод
dev_sheep
он умеет только в байты, либо в reader
Anton
можно reader попробовать подсунуть тот, из которого ты читать будешь
Илья
https://github.com/go-telegram-bot-api/telegram-bot-api/blob/ff42d6f7d1787d267bedf28764f69107820dd0fa/configs.go#L800
Илья
так этот "filereader", это обертка над обычным reader
dev_sheep
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
dev_sheep
сейчас так
Anton
попробуй resp.Body подсунуть в FileReader
Илья
но порефакторить придется, тк сейчас в этом скоупе ты закроешь body
dev_sheep
Илья
:)
dev_sheep
пофиг :В
dev_sheep
сейчас попробую тело запихнуть
Илья
не пофиг, если ты в defer тело уже закроешь, то читать потом будет нечего
dev_sheep
стопе, ведь оно все в одном методе
dev_sheep
угу, но может и в -1
Илья
ну, я как понял, из vk апишечки можно метаинфу собрать до скачивания тела?
dev_sheep
ну названия треков и тд - да
dev_sheep
вес - нет
Илья
да ладно :) resp.Header.Get("Content-Length")?
dev_sheep
ну или так :D
dev_sheep
так
dev_sheep
с filereader получилось
Aleksandr
закачал?
dev_sheep
да
dev_sheep
эффект тот же, но кода меньше
dev_sheep
осталось размер ему давать, чтобы не кушал память
dev_sheep
спасибо за помощь :) Отпишусь, как нормально сделаю...
Aleksandr
если что у меня для тебя уже хак припасен, который я в своенм боте юзаю
dev_sheep
dev_sheep
кстати, кастануть же string в int64 (байты контент-длинны в int64, требуемый либой) напрямую не получится?
dev_sheep
Mike
atoi ?
dev_sheep
точн
M
strconv.Atoi
dev_sheep
Офигеть, ребята. Спасибо огромное!!!
dev_sheep
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
}
dev_sheep
вот так память вообще не ест
dev_sheep
ни метра
dev_sheep
❤️
dev_sheep
правда надо тело придумать, как закрыть нормально :D
dev_sheep
Да, конечно. Эта магия решила все проблемы... Спасибо!
Илья
сделай структуру, где будет и filereader и тело, тогда, по окончании работы, ты сможешь закрыть тело
Илья
я так вижу :)
dev_sheep
о, точно. Подумаю...
dev_sheep
как бы ее назвать только...
dev_sheep
тут особо и нет фантазии :D
dev_sheep
а, я могу передавать ее в ретурн (тело всмысле). И там закрывать. Ибо выше функция максимально привязанная к архитектуре, а эта - нет :)