powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Как отбирать из потока 1/1000 лучших экземпляров?
25 сообщений из 151, страница 3 из 7
Как отбирать из потока 1/1000 лучших экземпляров?
    #40070634
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если перевести в плоскость примеров. На вход - миллард таких сущностей.

Input:
Код: sql
1.
2.
3.
4.
5.
6.
№,X1,X2,....XN,Q
1,2.......,0.003
2,5.......,0.002
3,5.......,0.002
.....
1000 000 000, 5,...... 0.001



На выходе 1 000 000 штук таких:
Код: sql
1.
2.
3.
4.
5.
№,X1,X2,....XN,Q
732, 5, ...... 1.000
11, 5, ...... 0.999
4346457, 7,......0.998
......



Тогда цена вопроса - просто выбор оптимальной дисковой структуры данных котора способна
втянуть в себя произвольное число таких записей (records) ранжированных по Q.

Для оперативной памяти - это может быть Куча (Heap) как уже кто-то предлагал.

Также пойдет красно-черное-дерево где ключ будет Q. На С++ ей соотвествует
любая сортируемая мапа.

Если памяти будет не хватать - пойдет Key-Valuе DBMS наподобие LevelDb. Для нее есть
интерфейсы программирования почти на всех языках.
...
Рейтинг: 0 / 0
Как отбирать из потока 1/1000 лучших экземпляров?
    #40070644
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, не понимаю, вы настолько технооптимист, что вообще не можете представить задачу, которую нельзя было бы решить брутфорсом? А если бы я тогда сказал "триллион" вместо "миллиард" (ну, да, мне просто фантазии не хватило)...
...
Рейтинг: 0 / 0
Как отбирать из потока 1/1000 лучших экземпляров?
    #40070649
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я - не технооптимист.
...
Рейтинг: 0 / 0
Как отбирать из потока 1/1000 лучших экземпляров?
    #40070657
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Иван FXS
mayton, не понимаю, вы настолько технооптимист, что вообще не можете представить задачу, которую нельзя было бы решить брутфорсом? А если бы я тогда сказал "триллион" вместо "миллиард" (ну, да, мне просто фантазии не хватило)...


Если вы сказали максимум триллион, значит у вас есть диска на миллиард. (Иначе вам некуда 1/1000 сохранить)

Далее следует решение white owl, которое вам отсеивает верхний миллиард. По окончании потока, который не превышает триллион, делите счётчик сущностей на 1000, округляете в удобную для вас сторону (рекомендую вверх), и берете таковое число строчек из отсеянного миллиарда который уже на диске. Готово: точное решение в один проход потока неизвестного заранее размера.

Не забудьте отвести счётчику сущностей хотя бы 40 бит, всё-таки триллион ожидаете.

Чем вас не устраивает точное решение задачи?
...
Рейтинг: 0 / 0
Как отбирать из потока 1/1000 лучших экземпляров?
    #40070659
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Иван FXS

Заковыка в том, что точного решения задача не имеет, ибо в процессе работы мы не можем определить, попадает ли то или иное Q в 1/1000 от всей выборки.
.


А, вижу. Вас наверное не устраивает то, что вы думали что точного решения не существует, а оно оказалось довольно очевидным.

Ну тогда давайте забудем о существовании точного решения и решим неточно, статистическими методами. Только не способом тыка папы Карло, а с формулами.

На основании значений первых N cущностей делаете предположение о статистическом распределении Q. Надеетесь на гауссовое или равномерное в фиксированном интервале. Затем, выбрав погрешность альфа, определяете Qmin, которое с заданной погрешностью альфа будет меньше чем верхний 0.1% значений Q всей популяции, затем отбирает все сущности из потока для которых Q > Qmin.

Не забудьте сохранить первые N сущностей предшествующие анализу; они не бросовые. Число N зависит от альфы.

Вуаля, неточное решение зато с формулами и ограничениями на распределение Q.
...
Рейтинг: 0 / 0
Как отбирать из потока 1/1000 лучших экземпляров?
    #40070670
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL, вы увидели мой ответ White Owl-у
Иван FXS
White Owl
Выделяешь себе в памяти массив в который влезет 1/1000 от потока и начинаешь оценивать поток
каждая сущность "большая", много больше, чем числовой параметр Q сам по себе, так что хранить их в памяти нельзя, можно только по очереди каждую оценивать и решать, сбрасывать её на диск или нет.
, который стоит в дискуссии прямо следом за его решением?
...
Рейтинг: 0 / 0
Как отбирать из потока 1/1000 лучших экземпляров?
    #40070687
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Иван FXS,

Видел конечно.

Вам в памяти сущности хранить и не требуется, только Q значения уже сохранённых на диске сущностей, чтобы знать какие из них заменять.

Может, у вас какие-то другие ограничения в задаче? Например, входной поток бесконечный, или диск не разрешает перезапись? Тогда точное решение не существует, и можно рассуждать об эвристиках.

И при условиях выше (поток произвольной длины, диск одноразовый) все эвристики разваливаются при Q = n, где n номер сущности в потоке.
...
Рейтинг: 0 / 0
Как отбирать из потока 1/1000 лучших экземпляров?
    #40070691
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL, вы прочитали в моём посте требование к обсуждаемому коду " сохранять на диске "самые лучшие" из сущностей по параметру Q"?

Если да, то ткните пальцем в то, каким образом "точное решение White Owl-а" будет исполнять это требование. Насколько я вижу, это "точное решение" просто игнорирует этот аспект задания.

Ну и у вас словарные расхождения, потому что там говорится " набиваешь все оцененные сущности в массив ", а вы это прочитываете как "в памяти сущности хранить и не требуется"...
...
Рейтинг: 0 / 0
Как отбирать из потока 1/1000 лучших экземпляров?
    #40070692
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL, в сухом остатке, ответьте мне,

вот я создал массив размером миллион под значения Q... и что я должен буду весь первый миллион сущностей на диск забубенить?
...
Рейтинг: 0 / 0
Как отбирать из потока 1/1000 лучших экземпляров?
    #40070693
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
и что я должен буду весь первый миллион сущностей на диск забубенить?

Да. В чём проблема-то? Потом будешь удалять худшие из них по мере прихода лучших. Опять же в чём проблема-то?

PS: Но сдаётся мне, что весь этот миллион таки влезет в ОЗУ. Потому что, как я уже сказал, при размере записи в килобайт это всего гигабайт суммарного объёма.
...
Рейтинг: 0 / 0
Как отбирать из потока 1/1000 лучших экземпляров?
    #40070698
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, проблема в том, например, что запись на диск это медленная операция. Я на другом форуме параллельно эту тему обсуждал, там люди, менее ленивые, чем я, быстренько сделали прогоны, и получилось, что при такой схеме работы на диск будет сбрасываться примерно в семь раз больше сущностей, чем 1/1000.

Dimitry Sibiryakov
весь этот миллион таки влезет в ОЗУ
это вы про мою СУБД (или -- более общо -- систему записи результатов на диск) со своего берега видите, что она, на самом деле, не пишет на диск то, что помещается в ОЗУ? Или мне самому предлагаете изменить "условия задачи" -- переписать "сохранять на диске" на "сохранять в ОЗУ"?

Или, типа, вместо "сохранять на диске" -- "буферизовать в ОЗУ, а потом когда-то (логика это "когда-то" не предъявлена) сохранять на диск"?
...
Рейтинг: 0 / 0
Как отбирать из потока 1/1000 лучших экземпляров?
    #40070699
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Иван FXS
НеофитSQL, в сухом остатке, ответьте мне,

вот я создал массив размером миллион под значения Q... и что я должен буду весь первый миллион сущностей на диск забубенить?


Да. Первый миллион точно*. А если Q сущностей монотонно растет, то вообще все сущности потока коснутся диска, по правилу FIFO. Мало того, для монотонно растущих Q ничего лучше и не будет.

В зависимости от размера диск кэша и стратегии отложенных записей, механический диск может и не трепыхнуться до самого конца задачи.

Не совсем в тему, но эту задачу базы данных решают точно и успешно каждый день. "Отсортировать таблицу неизвестной длины** по колонке Q, показать/сохранить первые 1% строчек". Строчки в БД могут содержать многомегабпйтные объекты.

(*) Предвидя возможные придирки, не всегда. min(1e6,N), где N длина потока.

(**) Иногда таблицы в БД не имеют известного числа строк. Это встречается, но не все с этим знакомы.
...
Рейтинг: 0 / 0
Как отбирать из потока 1/1000 лучших экземпляров?
    #40070701
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Иван FXS,

Я прочитал ваши недавние ответы, заметил что вас беспокоит скорость сохранения сущностей на диск.

Если точное решение не устраивает из-за медленной операции сохранения данных, которое в худшем случае включает в себя *все* сущности потока, ты вы будете оптимизировать сокращение числа сохранений в ущерб точности. Тут придется решать какой выигрыш стоит какой точности.

Например, отсортированный поток даст точность 0 (всегда не то что надо) для любой экономящей записи эвристики.

Если поток можно читать в два подхода, задача решается легко. Если Q перемешаны хорошо, можно что-то мудрить, все остальное разбивается об отсортированный поток.
...
Рейтинг: 0 / 0
Как отбирать из потока 1/1000 лучших экземпляров?
    #40070702
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL, дело даже не в том, беспокоит ли меня, а в том, что

" ха-ха, ты что, не знаешь, как из N сущностей отобрать K лучших по параметру Q?! "

-- не является ответом на вопрос:

" как организовать сохранение 1/1000 лучших экземпляров из обрабатываемого потока? "
...
Рейтинг: 0 / 0
Как отбирать из потока 1/1000 лучших экземпляров?
    #40070705
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К сожалению, неуважительное отношение к собеседнику это часто, но не всегда особенность русскоязычных форумов.
Причина возможно в том, что ценность специалиста в первую очередь определяется не знанием, а умением продуктивно общаться с коллегами, и улучшать эффективность команды. Для людей значительных знаний в какой-то технической области добавляется обязательное требование уметь преподавать: связно и доходчиво выражать мысли, точку зрения и т.д.

Для первоначальной постановки задачи решение white owl выглядит на мой взгляд превосходно, поэтому появились вопросы чем точное решение не подходит, и есть ли дополнительные критерии.
Не сразу, но выяснилось что есть важный для вас но ранее не упомянутый критерий количества сохранений, который вы связываете со скоростью.

Что я знаю о вашей задаче: у вас есть поток этих сущностей, каждая содержит неотделимую от нее метрику Q. Поток высокоскоростной, неизвестной но конечной длины не превышающей миллиард.
Нужно в один проход выбрать и сохранить верхние 0.1%
сущностей по метрике Q. Диапазон Q неизвестен, порядок следования сущностей может быть любой.
Устройство может сохранить один миллион сущностей, не больше.
Метод сохранения сущностей считается медленным, поэтому точное решение с перезаписью не годится.
Допускается неточное решение, если оно использует меньше сохранений чем точное.

Этого мало для ТЗ. Если бы меня наняли решать такую задачу, я бы задал вопросы:
- прочность критериев. Например, можно ли любую часть потока читать дважды?
- природа данных, происхождение и примеры. Мне известны неудачные данные, которые мочат все эвристики в нулевую точность.
- скоростные характеристики потока данных и механизма сохранения. Это важно. Например, если вход один гигабит, а сохранение всего 100mbps, то при соотношении чтение/запись 10:1 и выше сохранение перестанет тормозить процесс. Оптимизировать вечно нет смысла.
- скоростные параметры железа. Если вычисляла слабая, некоторые подходы исключаются.
- допустимое количество ошибок, как меняется
- допустимое время исполнения.
- есть ли требование регулировки, чтоб заказчик мог сам подкручивать быстрее/точнее
- формат результата: "пришло 100500 шт, самые верхние были #42, #69, .. из них сохранены 88%"

Не исключено, что в итоге после анализа и результатов тестов заказчик решит купить диск побыстрее, и не связываться с эвристикой у которой не полностью исследована связь между характером ввода и ошибкой результата.

Последнее вполне тянет на курсовую, где стоимость усилий и ответственность низкая.
...
Рейтинг: 0 / 0
Как отбирать из потока 1/1000 лучших экземпляров?
    #40070715
НеофитSQL
Что я знаю о вашей задаче: у вас есть поток этих сущностей, каждая содержит неотделимую от нее метрику Q. Поток высокоскоростной, неизвестной но конечной длины не превышающей миллиард.
Нужно в один проход выбрать и сохранить верхние 0.1% сущностей по метрике Q.
Диапазон Q неизвестен, порядок следования сущностей может быть любой.
Устройство может сохранить один миллион сущностей, не больше.
Метод сохранения сущностей считается медленным, поэтому точное решение с перезаписью не годится.
Допускается неточное решение, если оно использует меньше сохранений чем точное.

вот решение для этих условий:
бабушкин зайчик
размер потока значения не имеет
вы просто сравниваете текущее значение с минимальным в массиве на X элементов
и если больше, то заменяете это минимальное значение в массиве
далее берёте новое минимальное, и т.о. заполняете массив самыми высокими значениями
диск нужен, только когда надо сохранить уже заполненный массив, а так то текущий массив в памяти живёт

0.1% от триллиона? это ярд интов = 4 гигабайта (нужны ведь только Q, а строки из БД брать по необходимости)
ну вообще не бох весть какая память, на каждом втором компе есть
но если вдруг понадобится не 0.1, а 1%, то на диск можно скидывать верхние 500, оставляя в памяти самое мелкое в них значение, и вот его тогда менять (предварительно конечно рассортировав по файлам от меньшего к большему)
...
Рейтинг: 0 / 0
Как отбирать из потока 1/1000 лучших экземпляров?
    #40070718
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
(нужны ведь только Q, а строки из БД брать по необходимости )
если вы это увидели в моём посте, то ... вам это померещилось -- там вообще ни слова нет про "строки из БД брать".
...
Рейтинг: 0 / 0
Как отбирать из потока 1/1000 лучших экземпляров?
    #40070719
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Этого мало для ТЗ. Если бы меня наняли решать такую задачу, я бы задал вопросы
я не выдавал ТЗ и не нанимал никого решать такую задачу, а надеялся услышать соображения по поводу этой задачи (желательно, полезные) и -- в ходе дискуссии -- дополнительно прояснить свои собственные представления о ней. Что мне удалось ( 22321734 ) только отчасти ( 22321904 ). И было это на первой странице обсуждения, а сейчас идёт уже третья ... честно говоря, не очень мне понятно, о чём (мне настойчиво объясняют, что есть решение брутфорс, и как оно прекрасно).
...
Рейтинг: 0 / 0
Как отбирать из потока 1/1000 лучших экземпляров?
    #40070724
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Несколько слов о задаче, в рамках размышления о которой был написан пост:

1) "сущности" о которых идет речь, генерируются в два этапа;

2) на первом этапе на основании ключа (key) генерируется пачка из 100 пред-сущностей (по числу тикеров [ticker] в индексе NASDAQ100) -- так что (повторно) сгенерировать одну из них не намного легче, чем все сто разом;

3) на втором этапе для каждой из этих 100 пред-сущностей сканируется несколько сотен (пусть будет 200) значений порога [p], каждый из которых даёт своё индивидуальное значение качества Q.

4) то есть вот этой тройкой (key; ticker; p) задаётся та сущность, для которой нужно по её Q решить -- для каждого тикера отдельно , -- попадает ли она в 0.1% лучших, то есть достойна ли она того, чтобы быть сохраненной (на диск).

Итак, хотите накапливать в буфере только значения (key; ticker; p), а потом -- когд-то -- решить, какие из них сохранять? Пожалуйста, только для повторной генерации каждой сущности нужно будет затратить примерно в 100*200 = 20000 больше вычислительных ресурсов, чем тратилось на генерацию её в "пакетном" режиме. Но брутфорс ведь наше всё.
...
Рейтинг: 0 / 0
Как отбирать из потока 1/1000 лучших экземпляров?
    #40070727
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
накапливать в буфере только значения (key; ticker; p)
только значения (key; ticker; p; Q), конечно.
...
Рейтинг: 0 / 0
Как отбирать из потока 1/1000 лучших экземпляров?
    #40070750
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
НеофитSQL
Что я знаю о вашей задаче: у вас есть поток этих сущностей, каждая содержит неотделимую от нее метрику Q. Поток высокоскоростной, неизвестной но конечной длины не превышающей миллиард.
Нужно в один проход выбрать и сохранить верхние 0.1% сущностей по метрике Q.
Диапазон Q неизвестен, порядок следования сущностей может быть любой.
Устройство может сохранить один миллион сущностей, не больше.
Метод сохранения сущностей считается медленным, поэтому точное решение с перезаписью не годится.
Допускается неточное решение, если оно использует меньше сохранений чем точное.

вот решение для этих условий:
бабушкин зайчик
размер потока значения не имеет
вы просто сравниваете текущее значение с минимальным в массиве на X элементов
и если больше, то заменяете это минимальное значение в массиве
далее берёте новое минимальное, и т.о. заполняете массив самыми высокими значениями
диск нужен, только когда надо сохранить уже заполненный массив, а так то текущий массив в памяти живёт

0.1% от триллиона? это ярд интов = 4 гигабайта (нужны ведь только Q, а строки из БД брать по необходимости)
ну вообще не бох весть какая память, на каждом втором компе есть
но если вдруг понадобится не 0.1, а 1%, то на диск можно скидывать верхние 500, оставляя в памяти самое мелкое в них значение, и вот его тогда менять (предварительно конечно рассортировав по файлам от меньшего к большему)

Я тоже самое хотел предложить. Но непонятно почему Иван ведет себя так агрессивно по отношению к программистам,
придя в форум программирования. И почему очередь с приоритетами он называет "брутфорсом". С моей точки зрения
это просто структура данных.
...
Рейтинг: 0 / 0
Как отбирать из потока 1/1000 лучших экземпляров?
    #40070755
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Но непонятно почему Иван ведет себя так агрессивно по отношению к программистам,
может быть потому, что вы подписываетесь под "решением", содержащим в себе конструкцию "строки из БД брать по необходимости" -- при том, что в моём исходном посте вообще ни слова нет о "строки из БД брать"... то есть нет ни "строки", ни "БД", ни "брать"!

Если "строки" уже "в БД", и их можно оттуда "брать" -- то в чём, по-вашему, может состоять задача? Посчитать для этих строк Q и дописать его "в БД" (или куда-то рядом), а потом "ха-ха, из N сущностей суметь выбрать K лучших по критерию Q"? Ну да, это в самом деле "ха-ха".
...
Рейтинг: 0 / 0
Как отбирать из потока 1/1000 лучших экземпляров?
    #40070759
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сущности. Строки. DataRows. Tuples. Entities. Objects. Да такая она... проф-деформация.
...
Рейтинг: 0 / 0
Как отбирать из потока 1/1000 лучших экземпляров?
    #40070761
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще, я зря повелся и согласился на предложение (в третьей реплике от начала обсуждения!):

"заранее оценить сколько всего сущностей есть в потоке"

-- поток это поток, труба, в ней течёт вода. А мне говорят: ну, сколько там может быть воды в той трубе -- выкопай бассейн, собери в нем всю воду, и делай с ней всё, что хочешь.
...
Рейтинг: 0 / 0
Как отбирать из потока 1/1000 лучших экземпляров?
    #40070769
Иван FXS
бабушкин зайчик
(нужны ведь только Q, а строки из БД брать по необходимости )
если вы это увидели в моём посте, то ... вам это померещилось -- там вообще ни слова нет про "строки из БД брать".

не видел я у вас в ТЗ, чтобы вам прямо во время поиска Q надо было пользоваться значениями
в таких задачах обычно сначала отбирают нужное, а потом уже им пользуются
Иван FXS
только значения (key; ticker; p; Q), конечно.

как бы там ни было, в чём проблема сложить эти ваши значения в БД, оставив в памяти лишь Q, из которых отсеять нужные?
Помимо очевидных выгод, таким образом можно надеяться, что данные не выпадут из кэша CPU, что ускорит процесс раз в 50.
...
Рейтинг: 0 / 0
25 сообщений из 151, страница 3 из 7
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Как отбирать из потока 1/1000 лучших экземпляров?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]