powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Очень большой TDictionary
64 сообщений из 64, показаны все 3 страниц
Очень большой TDictionary
    #39929982
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть у меня TObjectDictionary(TKey, TValue). И в нем очень-очень много элементов. Настолько много, что ОП не хватает. Приходит на ум использовать файлы. Но это гигантская потеря производительности. Как найти баланс?
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39929983
Sinemurius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решение - СУБД. Без вариантов.
Если попробуете самостоятельно реализовать, то получится самописное СУБД.
Есть локальные варианты: к примеру SQLite или Embedded Firebird.
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39929984
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb,

Добавить оперативки или изменить алгоритм.
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39929986
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb
очень-очень много элементов

Это сколько, в цифрах?
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39929989
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey, от 2 до 10 млрд
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39929991
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat, 30 Гб оперативки
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39929992
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb
от 2 до 10 млрд

Только на хранение указателей (даже не данных) на 10млрд. объектов требуется около 75GB памяти. У тебя её сколько?
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39929993
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb
30 Гб оперативки

Ну привет, чо.
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39929997
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb
rgreat, 30 Гб оперативки


Прибавьте ОЗУ, раз не хватает!
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39929999
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb
rgreat, 30 Гб оперативки
У меня на паре серверов по 256 гб.
И на тему алгоритма: ты уверен что тебе нужны все элементы словаря одновременно и с одинаковой частотой?

Если есть менее нужные, то их можно и скидывать на диск.
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930000
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
И на тему алгоритма: ты уверен что тебе нужны все элементы словаря одновременно и с одинаковой частотой?

Да
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930002
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb

Да

Размер ключа и объектов?
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930003
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbДа

Значит что-то сильно не так с твоим алгоритмом или даже постановкой задачи.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930006
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
TKey = record
int1: uint32
int2: uint32
int3: uint32
int4: uint16
int5: uint16
int6: uint16

TValue = record
int1: uint32
int2: uint32
int3: uint32
int4: uint16
int5: uint16
int6: uint16
dt1: Tdatetime
dt2: Tdatetime
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930010
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb,

Слишком большой ключ и как я понимаю он дублирует 80% полей value.

Либо урезай его, либо выкини из value дублирующиеся поля. Они и так есть в ключе.

Ну еще можно сделать словарь не по ключу а по его int64 хэшу.
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930012
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat, данные разные, а int64 хэш можно попробовать
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930013
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У словаря размер хеша всего 4 млрд. значений. Учитывая алгорит его работы, сильно сомневаюсь, что даже в теории он сможет хранить более 2 млрд. элементов. Ну а если учесть, что идеальных хешей нет, думаю, его эффективность начнёт падать значительно раньше этой цифры.
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930015
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb,

Как ты собрался оперировать такими объёмами данных, когда только для хранения 1 млрд. твоих значений требуется больше 30Gb? (без учёта накладных расходов на структуру словаря).
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930016
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey, потому что мне никто не сказал, что будет больше 1 млрд, и даже более 100 млн
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930019
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Да, пожалуй стоит ограничиться 32 битным ключом.
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930026
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb> потому что мне никто не сказал, что будет больше 1 млрд, и даже более 100 млн

А какая собсно прикладная задача решается? Перебор паролей какой-то или что?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930042
Sinemurius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Продублирую еще раз.
В твоей ситуации единственный вариант - это локальная СУБД.
В БД ты можешь хранить сколько угодно данных. Лишь бы на диске поместились.
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930052
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть ещё
https://www.sql.ru/forum/1178076-a/oficialnyy-reliz-cachedbuffers
это?
Ну т.е. чтобы в памяти не хранить, а в файле.
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930058
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SinemuriusВ твоей ситуации единственный вариант - это локальная СУБД.

Вариантов-то дофига. Но таки да, этим может воспользвоаться даже самый неопытный программист.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930062
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Вариантов-то дофига.
Почему дофига ? Наращивание памяти это не решение.
Вынос в БД - единственное вменяемое решение. Варианты только в способе хранения/записи/чтении.
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930064
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
А какая собсно прикладная задача решается? Перебор паролей какой-то или что?
Поиск гадости в видеопотоке, который передается по udp
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930065
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L_argoПочему дофига ? Наращивание памяти это не решение.

А ещё есть потоковые алгоритмы, map-reduce, сжатие/свёртка и т.д. и т.п.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930066
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L_argo
Dimitry Sibiryakov
Вариантов-то дофига.
Почему дофига ? Наращивание памяти это не решение.
Вынос в БД - единственное вменяемое решение. Варианты только в способе хранения/записи/чтении.


СУБД логично, но система реал-тайм и требования к производительности высокие. Раньше нагрузка была не большая и архитектура решала свои задачи, но хотелки растут, качество видео тоже.
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930067
Sinemurius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

SinemuriusВ твоей ситуации единственный вариант - это локальная СУБД.

Вариантов-то дофига.


Смотрите: по Вашим потребностям можно сформулировать следующие аксиомы:

1. В ОЗУ это не поместится. Особенно, если думать про перспективу. Соответственно, данные должны храниться в файлах.

2. Данные должны быть структурированы. То есть найти данные по ключу нужно найти с минимальным количеством чтений. Перечитывать 30 Гб - это не вариант.

Эти два аксиомы собственно и описывают то, что называется БД.
Все остальные варианты - это некие эрзацы СУБД.
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930068
Sinemurius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про потоки речь вроде не шла. Тут думать нужно.
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930070
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sinemurius
Все остальные варианты - это некие эрзацы СУБД.
Некоторые эрзацы СУБД очень интересны. А еще если бы можно было хранить TDictionary в filemap или типа того, но поиск по ключу был таким же быстрым, как и в ОП, или хотя бы немного уступал (немного понятие размытое), то это было бы супер
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930071
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sinemurius
В ОЗУ это не поместится. Особенно, если думать про перспективу. Соответственно, данные должны храниться в файлах.


Шардирование никто не отменял.. Можно развернуть хоть 20 серверов по 100 Гб ОЗУ и все распихать там... Вопрос только в ресурсе и деньгах...
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930076
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite, всегда все упирается в деньги
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930080
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbвсегда все упирается в деньги

Да. Включая те, которые платят более опытному и способному разработчику.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930084
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb
Sinemurius
Все остальные варианты - это некие эрзацы СУБД.
Некоторые эрзацы СУБД очень интересны. А еще если бы можно было хранить TDictionary в filemap или типа того, но поиск по ключу был таким же быстрым, как и в ОП, или хотя бы немного уступал (немного понятие размытое), то это было бы супер


Где-то читал, что скоро наступит эпоха pcie5 и чтение ssd будет сопоставимым со скоростью ОЗУ. А пока не наступило, нужно выкручиваться имеющимися средствами. Судя по постановке задачи, тут либо озу наращивать, либо менять алгоритмы.
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930091
bk0010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрите nosql key-value (например https://aws.amazon.com/ru/nosql/key-value/). Они есть, уже распараллелены и оптимизированы.
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930130
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L_argo
Вынос в БД - единственное вменяемое решение. Варианты только в способе хранения/записи/чтении.


плюс хранение самой базы на зеракальном RAID на базе SSD.
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930138
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, опытных и способных на всех не хватает.

bk0010, интересное решение.
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930148
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ClickHouse ещё очень быстрая nosql БД.
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930166
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb,

база данных, думаю, будет лучшим решением. врятли у тебя сверх-уникальный случай. нужно искать максимально подходящую под задачу бд, тысячи их.
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930172
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
Судя по постановке задачи, тут либо озу наращивать, либо менять алгоритмы.

Можно сделать свой словарь с увеличенным размером хеша и возможностью работать с проекцией файла. На современных ssd с pcie можно получить очень хорошую скорость даже на рандомном доступе.
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930173
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbопытных и способных на всех не хватает.

Значит придётся тебе поднимать свою квалификацию.

Чисто из любопытства: неужели у тебя в самом деле есть 10 миллиардов образцов и ты
принятый пакет среди них ищешь?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930179
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
База будет в разы (если не на порядки) медленней чем словарь в памяти.
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930185
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если гонять все данные на сервер(ы) и обратно, то какая скорость канала должна быть?
Будет ли она сопоставима со скорость SSD?
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930189
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

база может быть в памяти целиком, если что:
https://en.wikipedia.org/wiki/List_of_in-memory_databases
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930194
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonбаза может быть в памяти целиком, если что

Я знаю, это трудно, но попробуй прочитать хотя бы первое сообщение топика.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930197
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
то какая скорость канала должна быть?

10Gbit например
X11
Будет ли она сопоставима со скорость SSD?

Теоретическая пропускная способность такого канала будет около 1Gb/s, что даже выше скоростей потребительских ssd при рандомном доступе.
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930209
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

я предлагаю варианты. у тебя есть что-то заведомо готовое для его случая?
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930211
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonу тебя есть что-то заведомо готовое для его случая?

Я понятия не имею каков "его случай". Он же так и не рассказал ничего кроме "поиск гадости
в видеопотоке". На это можно только предложить нейросеть: модно, стильно, молодёжно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930221
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey, и каналы должны быть перманентно стабильными. Сколько будет стоить такой канал или несколько?
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930231
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Чисто из любопытства: неужели у тебя в самом деле есть 10 миллиардов образцов и ты
принятый пакет среди них ищешь?..


10 точно нет, но до 1 млрд в пике может дойти
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930234
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в среднем 100 млн, но пиковая нагрузка сжирает вся ОП
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930244
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
каналы должны быть перманентно стабильными. Сколько будет стоить такой канал или несколько?

Цену оборудования 10GBit ты и сам можешь посмотреть (есть и бюджетные решения и дорогие), а вопрос стабильности в интранете, обычно, не стоит.
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930267
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbдо 1 млрд в пике может дойти

И ты собрал статистику попадания чтобы утверждать, что распределение по этому миллиарду
равномерно?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930269
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
И ты собрал статистику попадания чтобы утверждать, что распределение по этому миллиарду
равномерно?
Это важно в контексте его вопроса?
Вопрос равномерного распределения - это не более чем вопрос выбранной хэш-функции.
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930274
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, +/- равномерно
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930293
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatЭто важно в контексте его вопроса?

Да. Ему уже предлагали неиспользуемую часть словаря сбрасывать на диск.

cptngrb+/- равномерно

Какого размера ключ и какой процент пришедших фреймов удовлетворяет поиску?

Если процент мал, а ключ велик, то можно в памяти держать только первые два-три уровня
дерева, а остатки уже на диске. Это удержит высокую скорость переработки пакетов без
пакости за счёт торможения подозрительных.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930295
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb
до 1 млрд в пике может дойти

cptngrb
в среднем 100 млн, но пиковая нагрузка сжирает вся ОП

Что-то не сходится. У тебя ОЗУ должно закончится уже на ~310 млн (а то и раньше).
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930296
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
из 56 135 545 элементов найдено соответствий 51 745 976. Значит 92% используются сразу. Что сбрасывать на диск?
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930301
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbЧто сбрасывать на диск?

Всё. Оставить только то, что позволяет сразу сказать "пакет ок". Это в случае если "ок"
пакетов процентов 98.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930314
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey, 394 млн элементов в 50 ГБ укладывается, если без фантиков.
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930443
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В любом случае вне зависимости от инструмента можно также попробовать TValue подсократить. Например, две TDateTime занимают 16 байт, но какой диапазон из них нужен? Если его можно уложить в 4 байта, можно сэкономить 8 байт. А если объявить запись packed, то также сэкономить на выравнивании. В сумме вместо 40 байт TValue съеживается до 26, что при миллиарде значений дает экономию в 14 Гб.
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930473
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2, TDateTime можно и сократить до 4 байт, а вот о packet говорят производительность страдает, но можно потестить
...
Рейтинг: 0 / 0
Очень большой TDictionary
    #39930619
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb
Василий 2, TDateTime можно и сократить до 4 байт, а вот о packet говорят производительность страдает, но можно потестить

Отсюда не видно, как там у вас сравнение происходит, тч тестить не просто можно, а даже нужно. Тем более что это наипростейшая оптимизация (добавить всего одно слово + ребилд)
...
Рейтинг: 0 / 0
64 сообщений из 64, показаны все 3 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Очень большой TDictionary
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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