@Fsharp_chat

Страница 748 из 772
Grigoriy
09.10.2018
17:04:30
ща!

Ayrat
09.10.2018
17:05:26
да, так можно

Grigoriy
09.10.2018
17:05:44
AsyncSeq.bufferByCountAndTime

есть над чем подумать :)

Google
Grigoriy
09.10.2018
17:06:51
спасибище!

Ayrat
09.10.2018
17:20:23
есть над чем подумать :)
Чтобы взять гопак?)

Там в стримах оно есть уже. Stream.mapPipelinedJob

Grigoriy
09.10.2018
17:21:11
ты прям склоняешь :)

Ayrat
09.10.2018
17:22:15
И работает так как тебе надо!

Не чанками, а с постоянным уровнем параллелизма

Grigoriy
09.10.2018
17:23:17
я, вот смотрю на AsyncSeq.bufferByCount - те же чанки :(

Ayrat
09.10.2018
17:23:17
Так что один таймаут из чанка не подвесит весь чанк и программу впридачу

Да, я тебе говорил!

Я там даже ишью год назад сделал

Мне сказали - так и задумано

Grigoriy
09.10.2018
17:24:28
а iterAsyncParallelThrottled -> Async<unit> :(

Ayrat
09.10.2018
17:24:58
Стримыыы

Google
Ayrat
09.10.2018
17:25:04
(гопак)

Grigoriy
09.10.2018
17:25:26
ну AsyncSeq - оно тоже стрим... по идее

для моей задачи гопак (наверное) - из пушки по воробьям

Ayrat
09.10.2018
17:26:34
Ну как знаешь.

Всегда можешь навелосипедить воркеров на мейлбоксах

Roman
09.10.2018
17:27:31
https://github.com/gusty/ScrapeM

Ayrat
09.10.2018
17:27:34
Рекурсивненько и все такое

О, с этим парнем в Дублине пиво пил

Ayrat
09.10.2018
17:29:21
Да. Он в Джете

Roman
09.10.2018
17:29:49
круто, привет ему)

Grigoriy
09.10.2018
17:40:53
Directory.GetFiles(source) |> Seq.filter filterFn |> Seq.map (fun f -> async { use file = File.OpenRead(f) return! this.UploadFile(drive, Path.Combine(target, Path.GetFileName(f)), file) }) |> AsyncSeq.ofSeq |> AsyncSeq.bufferByCount 10 |> AsyncSeq.mapAsync (fun c -> c |> Async.Parallel) |> AsyncSeq.concatSeq |> AsyncSeq.toArrayAsync

те же чанки, но с человеческим лицом

Ayrat
09.10.2018
17:44:39
те же чанки, но с человеческим лицом
вот без либы - https://gist.github.com/Szer/60c9c88bec822463bd4af86371f2663b названия функций не смотри, это делалось под какую-то задачу

let requestMasterAsync limit urls = let results = Array.zeroCreate (List.length urls) let chunks = urls |> Seq.chunkBySize limit |> Seq.indexed async.For (chunks, fun (i, chunk) -> chunk |> Seq.map asyncMockup |> Async.Parallel >>- Seq.iteri (fun j r -> results.[i*limit+j]<-r)) >>- fun _ -> results

Grigoriy
09.10.2018
17:44:55
если сортирнуть по убыванию размера файлов то ожиданий неполных чанков должно быть поменьше

Ayrat
09.10.2018
17:45:52
если сортирнуть по убыванию размера файлов то ожиданий неполных чанков должно быть поменьше
я не знаю про GetFiles, но вот EnumerateFiles ленивый и если в процессе работы с папкой что-то происходит, то это повлияет на итерацию

вот пул воркеров на гопаке упакованный в класс https://gist.github.com/Szer/e9039e19c407a496efde44126c349626 для продакшна там есть другая версия

Grigoriy
09.10.2018
17:47:10
GetFiles: string -> string []

Ayrat
09.10.2018
17:48:56
GetFiles: string -> string []
это очень хорошо

Google
Grigoriy
09.10.2018
17:51:15
я только не понимаю, как сохраняется параллелизм при недостатке асинков в чанке?

Ayrat
09.10.2018
17:52:52
в гопак варианте очень даже

чанки потому и говно что ты ждёшь весь чанк

Grigoriy
09.10.2018
17:53:15
да

Ayrat
09.10.2018
17:53:25
и если там один запрос в таймаут попадёт, то бида

вот смотри гопачок!

let rec loop usage degree = degreeCh ^=> loop usage <|> doneCh ^=> (function | Choice1Of2 x -> Src.value goodOutput x | Choice2Of2 e -> Src.value badOutput e >=> fun _ -> loop (usage - 1) degree) <|> if usage < degree then inputCh ^=> (worker >> Job.catch >=> Ch.give doneCh >> Job.queue >=> fun _ -> loop (usage + 1) degree) else Alt.never()

кстати - ракета/рыба присутствует

Ayrat
09.10.2018
17:54:36
ретрайну всё
я имел в виду что ты ждать будешь весь чанк

хотя там уже все джобы отработали

семеро одного ждут

Grigoriy
09.10.2018
17:54:51
Воробушек покакал :)

семеро одного ждут
да это ясно всё

мне ж ещё на пальцах коллегам объяснять

Ayrat
09.10.2018
17:55:30
а вот в гопак варианте!!1 даже отдельные аутпуты есть для плохих и хороших окончаний. Т.е. снаружи можно принимать решения о ретрае

и аутпуты в виде стримов, т.е. можешь их далее как хочешь насиловать

короче, одни бонусы

Google
Ayrat
09.10.2018
17:57:25
а да, ещё он динамически скалируемый) т.е. можно прям на ходу добавлять убавлять параллелизма

как тебе такое, Илон Маск?

Grigoriy
09.10.2018
17:57:41
надо курнуть сначала!

Ayrat
09.10.2018
17:57:52
выпить!

Grigoriy
09.10.2018
17:58:14
И немедленно выпил. (с)

я подожду видосика твоего доклада... послушаю, помедитирую... и потом... :)

Grigoriy
09.10.2018
18:02:03
пока что это выше моего уровня компетенции

AsyncSeq я ещё хоть как-то понимаю

Сортировка по убыванию размера сократила время аплоада на 20%

решил остановиться :)

Kinrany
09.10.2018
21:05:08
Немного оффтопик: посоветуйте почитать короткий и language-agnostic список концепций, связанных с абстрактными вычислительными процессами? От чисел и бит информации до всяких реактивных потоков и свободных монад?

Vasily
09.10.2018
21:15:35
По фри монадам у Марка Симана есть статьи

Правда, они не отвязаны от языка

Grigoriy
09.10.2018
21:15:55
и у DeGoes'a

Vasily
09.10.2018
21:16:44
Ну да

По реактивщине хз

Эрик Мейер

Вроде это все педалировал и писал пейперы

Google
Grigoriy
09.10.2018
21:17:55
Мейер так ваще RxLib написал, которую на все языки мира портировали

Kinrany
09.10.2018
21:19:24
Пожалуй, я ищу именно список: про что-то конкретное найти информацию несложно, если знать, что искать. Хочется обзор идей, на которые случайно можно и не наткнуться

Сам из такого нашёл "Concepts, Techniques, and Models of Computer Programming", но это целая толстая книга на несколько семестров

Vasily
09.10.2018
21:28:36
Ну я не слышал про список идей

Это ж не матан

Kinrany
09.10.2018
21:47:29
Нуууу

Очень близко к абстрактной алгебре, разве нет? :D

Grigoriy
09.10.2018
21:47:57
Это ж не матан
Компутер сайнс!

@vshapenko Я тут ща запилил эту хрень, про которую ранее спрашивал совета, как отдельный нугет - с репкой, билдом и паблишом пэкеджа в VSTS Artifacts feed

Нина
10.10.2018
03:53:49
Ребят, а на F# вообще можно как-то относительно эффективно, но идиоматично для фп, реализовать перестановку бит числа по таблице? Или мне стоит бросить эту идею и писать это на C#? Там это, понятное дело, пять строк...

Grigoriy
10.10.2018
03:56:14
По какой таблице? :)

Нина
10.10.2018
04:00:44
Произвольной таблице, которая задаёт соответствие позиций битов результата битам исходного значению. В общем, я лучше покажу, как это у меня сейчас реализовано, минутку...

https://pastebin.com/R975UC3n

Grigoriy
10.10.2018
04:05:30
Ну, цикл - рекурсия

Битовые операции есть

Хм. Там вообще можно свёрткой по «таблице» сделать

foldBack

Нина
10.10.2018
04:08:48
Логично. Я об этом даже как-то не подумала.

Grigoriy
10.10.2018
04:50:52
@VVatashi как успехи? :)

Нина
10.10.2018
04:53:02
Ну, вот к чему я пришла: https://pastebin.com/UpAuYevk

Страница 748 из 772