|
Как отбирать из потока 1/1000 лучших экземпляров?
|
|||
---|---|---|---|
#18+
Если перевести в плоскость примеров. На вход - миллард таких сущностей. Input: Код: sql 1. 2. 3. 4. 5. 6.
На выходе 1 000 000 штук таких: Код: sql 1. 2. 3. 4. 5.
Тогда цена вопроса - просто выбор оптимальной дисковой структуры данных котора способна втянуть в себя произвольное число таких записей (records) ранжированных по Q. Для оперативной памяти - это может быть Куча (Heap) как уже кто-то предлагал. Также пойдет красно-черное-дерево где ключ будет Q. На С++ ей соотвествует любая сортируемая мапа. Если памяти будет не хватать - пойдет Key-Valuе DBMS наподобие LevelDb. Для нее есть интерфейсы программирования почти на всех языках. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.05.2021, 15:35 |
|
Как отбирать из потока 1/1000 лучших экземпляров?
|
|||
---|---|---|---|
#18+
mayton, не понимаю, вы настолько технооптимист, что вообще не можете представить задачу, которую нельзя было бы решить брутфорсом? А если бы я тогда сказал "триллион" вместо "миллиард" (ну, да, мне просто фантазии не хватило)... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.05.2021, 17:19 |
|
Как отбирать из потока 1/1000 лучших экземпляров?
|
|||
---|---|---|---|
#18+
Я - не технооптимист. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.05.2021, 18:08 |
|
Как отбирать из потока 1/1000 лучших экземпляров?
|
|||
---|---|---|---|
#18+
Иван FXS mayton, не понимаю, вы настолько технооптимист, что вообще не можете представить задачу, которую нельзя было бы решить брутфорсом? А если бы я тогда сказал "триллион" вместо "миллиард" (ну, да, мне просто фантазии не хватило)... Если вы сказали максимум триллион, значит у вас есть диска на миллиард. (Иначе вам некуда 1/1000 сохранить) Далее следует решение white owl, которое вам отсеивает верхний миллиард. По окончании потока, который не превышает триллион, делите счётчик сущностей на 1000, округляете в удобную для вас сторону (рекомендую вверх), и берете таковое число строчек из отсеянного миллиарда который уже на диске. Готово: точное решение в один проход потока неизвестного заранее размера. Не забудьте отвести счётчику сущностей хотя бы 40 бит, всё-таки триллион ожидаете. Чем вас не устраивает точное решение задачи? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.05.2021, 19:49 |
|
Как отбирать из потока 1/1000 лучших экземпляров?
|
|||
---|---|---|---|
#18+
Иван FXS Заковыка в том, что точного решения задача не имеет, ибо в процессе работы мы не можем определить, попадает ли то или иное Q в 1/1000 от всей выборки. . А, вижу. Вас наверное не устраивает то, что вы думали что точного решения не существует, а оно оказалось довольно очевидным. Ну тогда давайте забудем о существовании точного решения и решим неточно, статистическими методами. Только не способом тыка папы Карло, а с формулами. На основании значений первых N cущностей делаете предположение о статистическом распределении Q. Надеетесь на гауссовое или равномерное в фиксированном интервале. Затем, выбрав погрешность альфа, определяете Qmin, которое с заданной погрешностью альфа будет меньше чем верхний 0.1% значений Q всей популяции, затем отбирает все сущности из потока для которых Q > Qmin. Не забудьте сохранить первые N сущностей предшествующие анализу; они не бросовые. Число N зависит от альфы. Вуаля, неточное решение зато с формулами и ограничениями на распределение Q. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.05.2021, 20:10 |
|
Как отбирать из потока 1/1000 лучших экземпляров?
|
|||
---|---|---|---|
#18+
НеофитSQL, вы увидели мой ответ White Owl-у Иван FXS White Owl Выделяешь себе в памяти массив в который влезет 1/1000 от потока и начинаешь оценивать поток ... |
|||
:
Нравится:
Не нравится:
|
|||
16.05.2021, 21:06 |
|
Как отбирать из потока 1/1000 лучших экземпляров?
|
|||
---|---|---|---|
#18+
Иван FXS, Видел конечно. Вам в памяти сущности хранить и не требуется, только Q значения уже сохранённых на диске сущностей, чтобы знать какие из них заменять. Может, у вас какие-то другие ограничения в задаче? Например, входной поток бесконечный, или диск не разрешает перезапись? Тогда точное решение не существует, и можно рассуждать об эвристиках. И при условиях выше (поток произвольной длины, диск одноразовый) все эвристики разваливаются при Q = n, где n номер сущности в потоке. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.05.2021, 23:58 |
|
Как отбирать из потока 1/1000 лучших экземпляров?
|
|||
---|---|---|---|
#18+
НеофитSQL, вы прочитали в моём посте требование к обсуждаемому коду " сохранять на диске "самые лучшие" из сущностей по параметру Q"? Если да, то ткните пальцем в то, каким образом "точное решение White Owl-а" будет исполнять это требование. Насколько я вижу, это "точное решение" просто игнорирует этот аспект задания. Ну и у вас словарные расхождения, потому что там говорится " набиваешь все оцененные сущности в массив ", а вы это прочитываете как "в памяти сущности хранить и не требуется"... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2021, 00:39 |
|
Как отбирать из потока 1/1000 лучших экземпляров?
|
|||
---|---|---|---|
#18+
НеофитSQL, в сухом остатке, ответьте мне, вот я создал массив размером миллион под значения Q... и что я должен буду весь первый миллион сущностей на диск забубенить? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2021, 00:52 |
|
Как отбирать из потока 1/1000 лучших экземпляров?
|
|||
---|---|---|---|
#18+
Иван FXS и что я должен буду весь первый миллион сущностей на диск забубенить? Да. В чём проблема-то? Потом будешь удалять худшие из них по мере прихода лучших. Опять же в чём проблема-то? PS: Но сдаётся мне, что весь этот миллион таки влезет в ОЗУ. Потому что, как я уже сказал, при размере записи в килобайт это всего гигабайт суммарного объёма. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2021, 00:59 |
|
Как отбирать из потока 1/1000 лучших экземпляров?
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, проблема в том, например, что запись на диск это медленная операция. Я на другом форуме параллельно эту тему обсуждал, там люди, менее ленивые, чем я, быстренько сделали прогоны, и получилось, что при такой схеме работы на диск будет сбрасываться примерно в семь раз больше сущностей, чем 1/1000. Dimitry Sibiryakov весь этот миллион таки влезет в ОЗУ Или, типа, вместо "сохранять на диске" -- "буферизовать в ОЗУ, а потом когда-то (логика это "когда-то" не предъявлена) сохранять на диск"? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2021, 01:28 |
|
Как отбирать из потока 1/1000 лучших экземпляров?
|
|||
---|---|---|---|
#18+
Иван FXS НеофитSQL, в сухом остатке, ответьте мне, вот я создал массив размером миллион под значения Q... и что я должен буду весь первый миллион сущностей на диск забубенить? Да. Первый миллион точно*. А если Q сущностей монотонно растет, то вообще все сущности потока коснутся диска, по правилу FIFO. Мало того, для монотонно растущих Q ничего лучше и не будет. В зависимости от размера диск кэша и стратегии отложенных записей, механический диск может и не трепыхнуться до самого конца задачи. Не совсем в тему, но эту задачу базы данных решают точно и успешно каждый день. "Отсортировать таблицу неизвестной длины** по колонке Q, показать/сохранить первые 1% строчек". Строчки в БД могут содержать многомегабпйтные объекты. (*) Предвидя возможные придирки, не всегда. min(1e6,N), где N длина потока. (**) Иногда таблицы в БД не имеют известного числа строк. Это встречается, но не все с этим знакомы. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2021, 01:35 |
|
Как отбирать из потока 1/1000 лучших экземпляров?
|
|||
---|---|---|---|
#18+
Иван FXS, Я прочитал ваши недавние ответы, заметил что вас беспокоит скорость сохранения сущностей на диск. Если точное решение не устраивает из-за медленной операции сохранения данных, которое в худшем случае включает в себя *все* сущности потока, ты вы будете оптимизировать сокращение числа сохранений в ущерб точности. Тут придется решать какой выигрыш стоит какой точности. Например, отсортированный поток даст точность 0 (всегда не то что надо) для любой экономящей записи эвристики. Если поток можно читать в два подхода, задача решается легко. Если Q перемешаны хорошо, можно что-то мудрить, все остальное разбивается об отсортированный поток. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2021, 02:01 |
|
Как отбирать из потока 1/1000 лучших экземпляров?
|
|||
---|---|---|---|
#18+
НеофитSQL, дело даже не в том, беспокоит ли меня, а в том, что " ха-ха, ты что, не знаешь, как из N сущностей отобрать K лучших по параметру Q?! " -- не является ответом на вопрос: " как организовать сохранение 1/1000 лучших экземпляров из обрабатываемого потока? " ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2021, 02:13 |
|
Как отбирать из потока 1/1000 лучших экземпляров?
|
|||
---|---|---|---|
#18+
К сожалению, неуважительное отношение к собеседнику это часто, но не всегда особенность русскоязычных форумов. Причина возможно в том, что ценность специалиста в первую очередь определяется не знанием, а умением продуктивно общаться с коллегами, и улучшать эффективность команды. Для людей значительных знаний в какой-то технической области добавляется обязательное требование уметь преподавать: связно и доходчиво выражать мысли, точку зрения и т.д. Для первоначальной постановки задачи решение white owl выглядит на мой взгляд превосходно, поэтому появились вопросы чем точное решение не подходит, и есть ли дополнительные критерии. Не сразу, но выяснилось что есть важный для вас но ранее не упомянутый критерий количества сохранений, который вы связываете со скоростью. Что я знаю о вашей задаче: у вас есть поток этих сущностей, каждая содержит неотделимую от нее метрику Q. Поток высокоскоростной, неизвестной но конечной длины не превышающей миллиард. Нужно в один проход выбрать и сохранить верхние 0.1% сущностей по метрике Q. Диапазон Q неизвестен, порядок следования сущностей может быть любой. Устройство может сохранить один миллион сущностей, не больше. Метод сохранения сущностей считается медленным, поэтому точное решение с перезаписью не годится. Допускается неточное решение, если оно использует меньше сохранений чем точное. Этого мало для ТЗ. Если бы меня наняли решать такую задачу, я бы задал вопросы: - прочность критериев. Например, можно ли любую часть потока читать дважды? - природа данных, происхождение и примеры. Мне известны неудачные данные, которые мочат все эвристики в нулевую точность. - скоростные характеристики потока данных и механизма сохранения. Это важно. Например, если вход один гигабит, а сохранение всего 100mbps, то при соотношении чтение/запись 10:1 и выше сохранение перестанет тормозить процесс. Оптимизировать вечно нет смысла. - скоростные параметры железа. Если вычисляла слабая, некоторые подходы исключаются. - допустимое количество ошибок, как меняется - допустимое время исполнения. - есть ли требование регулировки, чтоб заказчик мог сам подкручивать быстрее/точнее - формат результата: "пришло 100500 шт, самые верхние были #42, #69, .. из них сохранены 88%" Не исключено, что в итоге после анализа и результатов тестов заказчик решит купить диск побыстрее, и не связываться с эвристикой у которой не полностью исследована связь между характером ввода и ошибкой результата. Последнее вполне тянет на курсовую, где стоимость усилий и ответственность низкая. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2021, 05:19 |
|
Как отбирать из потока 1/1000 лучших экземпляров?
|
|||
---|---|---|---|
#18+
НеофитSQL Что я знаю о вашей задаче: у вас есть поток этих сущностей, каждая содержит неотделимую от нее метрику Q. Поток высокоскоростной, неизвестной но конечной длины не превышающей миллиард. Нужно в один проход выбрать и сохранить верхние 0.1% сущностей по метрике Q. Диапазон Q неизвестен, порядок следования сущностей может быть любой. Устройство может сохранить один миллион сущностей, не больше. Метод сохранения сущностей считается медленным, поэтому точное решение с перезаписью не годится. Допускается неточное решение, если оно использует меньше сохранений чем точное. вот решение для этих условий: бабушкин зайчик размер потока значения не имеет вы просто сравниваете текущее значение с минимальным в массиве на X элементов и если больше, то заменяете это минимальное значение в массиве далее берёте новое минимальное, и т.о. заполняете массив самыми высокими значениями диск нужен, только когда надо сохранить уже заполненный массив, а так то текущий массив в памяти живёт 0.1% от триллиона? это ярд интов = 4 гигабайта (нужны ведь только Q, а строки из БД брать по необходимости) ну вообще не бох весть какая память, на каждом втором компе есть но если вдруг понадобится не 0.1, а 1%, то на диск можно скидывать верхние 500, оставляя в памяти самое мелкое в них значение, и вот его тогда менять (предварительно конечно рассортировав по файлам от меньшего к большему) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2021, 08:07 |
|
Как отбирать из потока 1/1000 лучших экземпляров?
|
|||
---|---|---|---|
#18+
бабушкин зайчик (нужны ведь только Q, а строки из БД брать по необходимости ) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2021, 08:36 |
|
Как отбирать из потока 1/1000 лучших экземпляров?
|
|||
---|---|---|---|
#18+
НеофитSQL Этого мало для ТЗ. Если бы меня наняли решать такую задачу, я бы задал вопросы ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2021, 08:38 |
|
Как отбирать из потока 1/1000 лучших экземпляров?
|
|||
---|---|---|---|
#18+
Несколько слов о задаче, в рамках размышления о которой был написан пост: 1) "сущности" о которых идет речь, генерируются в два этапа; 2) на первом этапе на основании ключа (key) генерируется пачка из 100 пред-сущностей (по числу тикеров [ticker] в индексе NASDAQ100) -- так что (повторно) сгенерировать одну из них не намного легче, чем все сто разом; 3) на втором этапе для каждой из этих 100 пред-сущностей сканируется несколько сотен (пусть будет 200) значений порога [p], каждый из которых даёт своё индивидуальное значение качества Q. 4) то есть вот этой тройкой (key; ticker; p) задаётся та сущность, для которой нужно по её Q решить -- для каждого тикера отдельно , -- попадает ли она в 0.1% лучших, то есть достойна ли она того, чтобы быть сохраненной (на диск). Итак, хотите накапливать в буфере только значения (key; ticker; p), а потом -- когд-то -- решить, какие из них сохранять? Пожалуйста, только для повторной генерации каждой сущности нужно будет затратить примерно в 100*200 = 20000 больше вычислительных ресурсов, чем тратилось на генерацию её в "пакетном" режиме. Но брутфорс ведь наше всё. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2021, 09:31 |
|
Как отбирать из потока 1/1000 лучших экземпляров?
|
|||
---|---|---|---|
#18+
Иван FXS накапливать в буфере только значения (key; ticker; p) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2021, 09:43 |
|
Как отбирать из потока 1/1000 лучших экземпляров?
|
|||
---|---|---|---|
#18+
бабушкин зайчик НеофитSQL Что я знаю о вашей задаче: у вас есть поток этих сущностей, каждая содержит неотделимую от нее метрику Q. Поток высокоскоростной, неизвестной но конечной длины не превышающей миллиард. Нужно в один проход выбрать и сохранить верхние 0.1% сущностей по метрике Q. Диапазон Q неизвестен, порядок следования сущностей может быть любой. Устройство может сохранить один миллион сущностей, не больше. Метод сохранения сущностей считается медленным, поэтому точное решение с перезаписью не годится. Допускается неточное решение, если оно использует меньше сохранений чем точное. вот решение для этих условий: бабушкин зайчик размер потока значения не имеет вы просто сравниваете текущее значение с минимальным в массиве на X элементов и если больше, то заменяете это минимальное значение в массиве далее берёте новое минимальное, и т.о. заполняете массив самыми высокими значениями диск нужен, только когда надо сохранить уже заполненный массив, а так то текущий массив в памяти живёт 0.1% от триллиона? это ярд интов = 4 гигабайта (нужны ведь только Q, а строки из БД брать по необходимости) ну вообще не бох весть какая память, на каждом втором компе есть но если вдруг понадобится не 0.1, а 1%, то на диск можно скидывать верхние 500, оставляя в памяти самое мелкое в них значение, и вот его тогда менять (предварительно конечно рассортировав по файлам от меньшего к большему) Я тоже самое хотел предложить. Но непонятно почему Иван ведет себя так агрессивно по отношению к программистам, придя в форум программирования. И почему очередь с приоритетами он называет "брутфорсом". С моей точки зрения это просто структура данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2021, 11:32 |
|
Как отбирать из потока 1/1000 лучших экземпляров?
|
|||
---|---|---|---|
#18+
mayton Но непонятно почему Иван ведет себя так агрессивно по отношению к программистам, Если "строки" уже "в БД", и их можно оттуда "брать" -- то в чём, по-вашему, может состоять задача? Посчитать для этих строк Q и дописать его "в БД" (или куда-то рядом), а потом "ха-ха, из N сущностей суметь выбрать K лучших по критерию Q"? Ну да, это в самом деле "ха-ха". ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2021, 11:47 |
|
Как отбирать из потока 1/1000 лучших экземпляров?
|
|||
---|---|---|---|
#18+
Сущности. Строки. DataRows. Tuples. Entities. Objects. Да такая она... проф-деформация. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2021, 11:58 |
|
Как отбирать из потока 1/1000 лучших экземпляров?
|
|||
---|---|---|---|
#18+
вообще, я зря повелся и согласился на предложение (в третьей реплике от начала обсуждения!): "заранее оценить сколько всего сущностей есть в потоке" -- поток это поток, труба, в ней течёт вода. А мне говорят: ну, сколько там может быть воды в той трубе -- выкопай бассейн, собери в нем всю воду, и делай с ней всё, что хочешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2021, 12:08 |
|
Как отбирать из потока 1/1000 лучших экземпляров?
|
|||
---|---|---|---|
#18+
Иван FXS бабушкин зайчик (нужны ведь только Q, а строки из БД брать по необходимости ) не видел я у вас в ТЗ, чтобы вам прямо во время поиска Q надо было пользоваться значениями в таких задачах обычно сначала отбирают нужное, а потом уже им пользуются Иван FXS только значения (key; ticker; p; Q), конечно. как бы там ни было, в чём проблема сложить эти ваши значения в БД, оставив в памяти лишь Q, из которых отсеять нужные? Помимо очевидных выгод, таким образом можно надеяться, что данные не выпадут из кэша CPU, что ускорит процесс раз в 50. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2021, 13:01 |
|
|
start [/forum/topic.php?fid=16&msg=40070644&tid=1339663]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
30ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
125ms |
get tp. blocked users: |
1ms |
others: | 256ms |
total: | 450ms |
0 / 0 |