> Тогда не понятно в чём может быть затык. Ты бы лучше куски кода
> постил, а то телепатия нынче редкость.

На текущий момент - затык с диском.

> > - Послушал как работает машина (в натуре на слух), и понял - нужно
> > нафиг отключить буферизацию файловых операций. То бишь указал флаги
> > FILE_FLAG_WRITE_THROUGH, FILE_FLAG_NO_BUFFERING
>
> Ага. Именно назад, к природе. А ты ещё на IBAPI бочку катил ;)

Ну не равняйте этого с этой, пожалуйста.

> На самом деле FILE_FLAG_WRITE_THROUGH имеет смысл для увеличения
> надёжности и когда памяти в компе мало. Если памяти много, то
> этот флаг лучше не ставить. FILE_FLAG_NO_BUFFERING я вообше не
> понимаю чем тут может помочь.

Я тоже. Но это работает и ладно.

> > отказаться от
> > мелких блоков, а перейти к блокам занимающим всю страницу целиком.
> > Продолбенился над реализацией целый день. Получилось красиво.
> > И - о чудо! У меня многопоточная реализация стала работать вровень с
> > однопоточной.
>
> Ну что и следовало доказать. При увеличении размера блоков издержки
> на синхронизацию в процентном отношении падают.

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

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

> > Напомню, мне нужно построить уникальный индекс для (по последним
> > прогнозам) 100 лимонов элементов вида (ID1, ID2). Максимум что я смог
> > осилить - 20 лимонов.
>
> Что значит осилить? Какая цель то?

Есть множество пар (ID1, ID2). Их общее число где-то 350 лимонов.
Уникальных - 100 лимонов.

Нужно получить это множество уникальных пар. ID это целые числа.
Начинаются с 1 и заканчиваются, полагаю, в районе 100 лимонов. Есть
ещё одно правило - ID1 строго меньше ID2. Которое, возможно, сможет
оптимизировать конструкцию индекса.

------------------------------------
Я там про два часа говорил. Я не учел, что при том махании топором
неизбежно возникнут баги :(

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

Как я и предполагал - чтобы потоки генерации не забивали поток
выгрузки модифицированных страниц, при добавлении новой комбинации
нужно как можно меньше модифицировать страниц. В моем случае (хеш
таблица со списками отсортированных блоков) это 1-2 страницы. Если
поддерживать отсортированность сквозь все блоки списка -
производительность резко падает (модифицируется много блоков + из-за
разряженности быстрее жрется память)

Вот статистика по проведенному эксперименту
overflow [4] - число переполнений буфера входящих данных
flush [4879] - число опустошений этого буфера
words [102104] - число слов, из которых потом генерировались
комбинации
ip [17758789] - число уникальных комбинаций. Это то, что как раз
помещается в индекс
hit ip [11215320] - это число обращений к кэшу, которые нашли ранее
сгенерированную комбинацию
d_pages [30010] - число грязных страниц кэша
c_pages [90000] - число чисты страниц кэша

BlockCapacity:127 - число элементов на блоке списка (короче на - на
одной странице)
Далее число блоков в списке / количество списков с такой длиной
13:14
14:5287
15:4681
16:18

Общее число списков в хеш-таблице - 10000. Размер кэша 120010 страниц.
Как видно -таблица заполняется равномерно.

Скорость упала в районе 14.5 млн комбинаций. Это как раз кэш
закончился. Упала с 25 тысяч комбинаций до 300-400 комбинаций (это
финальная скорость). Ассинхронная работа с файлом не помогла - хотя
работало 4 потока генерации. Сразу после того как кэш закончился,
поток выгрузки модифицированных страниц, стаблизировал соотношение 30
тыс / 90 тыс, и оно не менялось до самого финиша (+/- 10 страниц).

Последние три лимона генерировались свыше 7 часов. Начальные 14.5
лимонов - полтора часа.

----
Вообщем движок есть. Я уже не знаю что туда можно прикрутить.
Есть понимание - длина пути поиска должна быть как можно короче.
Страницы должны заполняться как можно плотнее. Возможно это спорное
утверждение.
При вставке нужно модифицировать как можно меньше.

----
Вопрос - как это все объединить?

Я тут поприкладывал умную книгу к голове. Две вещи понравились

Первая - так называемые DST. Digital Search Tree. Высота дерева не
больше числа байт в ключе. В моем случае она не превысит восьми. Хотя,
вообще говоря - ID у меня 64-битное.

Вторая - Б-деревья.

Первая, в силу своей интутивной понятности, мне нравится гораздо
больше чем вторая. Не требует расшеплений узлов, балансировки. Не
нужно хранить ключ - он вычисляется при переходах. И я вроде как
понимаю как можно сделать параллельную работу с индексом. Для первых
двух байт ключа можно поддерживать таблицу в памяти. То есть, высота
сократится до 6 уровней.

Вторая вещь моим опухшим моском понимается. Но с трудом.

Люди, скажите что нибудь. Хотя бы такую вещь - FB может параллельно
добавлять новые ключи в индексы? Я уже начинаю верить, что в FB есть
что-то нереальное, раз он в состоянии управлять индексами для таблиц
размером больше 25 лимонов записей.

Я на выходных провел еще один эксперимент. И выяснил - пиво уже не в
состоянии расслабить мой моск. Его вытесняют в течении часа :(

Коваленко Дмитрий.

Reply via email to