В чем разница между кешем и хешем

Обновлено: 04.07.2024

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

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

В качестве альтернативы можно ввести строгое ограничение P≥1 на количество выполняемых проверок (для открытой адресации) или на размер любой из вторичных структур данных (для отдельной цепочки). В результате получается «забывчивый словарь»: ключи могут исчезнуть или, по крайней мере, стать невосстановимыми. Это достаточное ограничение. В свою очередь, стоимость поиска в худшем случае становится ограниченной. Короче говоря, теперь у нас есть алгоритм Монте-Карло: теперь мы можем ошибаться при поиске (ключи могут исчезнуть со временем), но изменчивость во время выполнения значительно снижена.

Назовем эту структуру данных "кэш-таблицей" как потому, что она полезна для кэширования результатов запросов, так и потому, что она соответствует наиболее распространенной организации кэшей в оборудовании. Мы уже некоторое время используем это имя в RAD, и я также видел, как оно используется в других местах, так что вполне вероятно, что кто-то независимо придумал то же самое имя для той же самой вещи, что я считаю хорошим знаком.< /p>

В обычных хеш-таблицах используются разные схемы проверки или отдельные цепочки с разными структурами данных. Для кэш-таблицы у нас есть строгое ограничение P на количество записей, которые мы допускаем в одном и том же сегменте, и практический выбор P относительно невелик, в однозначных или младших двузначных числах. Это делает наиболее естественным представление простого двумерного массива: N строк хэш-сегментов с P столбцами, в каждом из которых есть место для одной записи, образующих сетку N × P. Хранение всех записей в одной и той же строке рядом друг с другом приводит к благоприятным схемам доступа к памяти, лучше, чем большинство последовательностей тестов, используемых в открытой адресации, или структуры данных с большим количеством указателей, обычно используемые в отдельных цепочках.

Чтобы найти ключ, мы вычисляем индекс строки из хэш-кода, используя что-то вроде row = hash % N . Затем мы проверяем, есть ли совпадающая запись в этой строке, перебирая все P столбцов. Вот почему вы не хотите, чтобы P становилось слишком большим. То, что я только что описал, точно соответствует работе ассоциативного кэша с P-путями в аппаратном обеспечении, и иногда мы будем называть P числом «путей» в таблице кэша.

P=1 — это самый простой случай, который соответствует аппаратному кэшу с прямым отображением. Каждая запись имеет ровно одно место в массиве кеша, куда она может попасть; он либо есть, либо его нет вообще. Вставка записи означает замену предыдущей записи в этом месте.

Для P≠1 существует несколько вариантов замены элемента при вставке; какой из них будет выбран, определяется политикой замены. Есть много кандидатов на выбор, с различными компромиссами реализации; достойный вариант, который не требует дополнительных метаданных, хранящихся рядом с каждой строкой, — использовать случайную замену, то есть просто выбирать (псевдо)случайный столбец в данной строке для удаления при каждой вставке. «Подождите, — скажете вы, — разве хеш-коды уже не являются псевдослучайными?». Да, это так, но вы хотите использовать здесь генератор случайных чисел, независимый от вашей хеш-функции, иначе вы действительно просто создаете кеш с прямым отображением с строками N × P. Одним из преимуществ хранения P записей в строке является то, что это позволяет нам иметь два разных ключа с одинаковыми значениями хеш-функции (т. е. конфликт хэшей) в одной и той же таблице; что касается проблемы дня рождения, даже с хорошо распределенным хэшем вы, вероятно, увидите коллизии.

Для чего полезен этот тип структуры данных? На данный момент я столкнулся с двумя классами вариантов использования:

GPL Ghostscript 8.61

Пт, 10 октября 00:00:01 2008

GPL Ghostscript 8.61

Пт, 10 октября 00:00:01 2008

GPL Ghostscript 8.61

Пт, 10 октября 00:00:01 2008

GPL Ghostscript 8.61

Пт, 10 октября 00:00:01 2008

GPL Ghostscript 8.61

Пт, 10 октября 00:00:01 2008

GPL Ghostscript 8.61

Пт, 10 октября 00:00:01 2008

GPL Ghostscript 8.61

Пт, 10 октября 00:00:01 2008

GPL Ghostscript 8.61

Пт, 10 октября 00:00:01 2008

GPL Ghostscript 8.61

Пт, 10 октября 00:00:01 2008

GPL Ghostscript 8.61

Пт, 10 октября 00:00:01 2008

GPL Ghostscript 8.61

Пт, 10 октября 00:00:01 2008

GPL Ghostscript 8.61

Пт, 10 октября 00:00:01 2008

GPL Ghostscript 8.61

Пт, 10 октября 00:00:01 2008

GPL Ghostscript 8.61

Пт, 10 октября 00:00:01 2008

Библиотека Adobe PDF 8.0

<Р> endstream endobj 161 0 объект> endobj Xref 0 162 0000000000 65535 F 0000042277 00000 п 0000042652 00000 п 0000049895 00000 п 0000051741 00000 п 0000053269 00000 п 0000061998 00000 п 0000063844 00000 п 0000064264 00000 п 0000072883 00000 п 0000072908 00000 п 0000073225 00000 п 0000075072 00000 п 0000076798 00000 п 0000085594 00000 п 0000086020 00000 п 0000086243 00000 п 0000086312 00000 п 0000086447 00000 п 0000086472 00000 п 0000086769 00000 п 0000086795 00000 п 0000087100 00000 п 0000087519 00000 п 0000087744 00000 п 0000087813 00000 п 0000087947 00000 п 0000087972 00000 п 0000088268 00000 п 0000090115 00000 п 0000091218 00000 п 0000100213 00000 п 0000100239 00000 п 0000100536 00000 п 0000100992 00000 п 0000101212 00000 п 0000101281 00000 п 0000101415 00000 п 0000101440 00000 п 0000101737 00000 п 0000102244 00000 п 0000102472 00000 п 0000102541 00000 п 0000102677 00000 п 0000102702 00000 п 0000103000 00000 0000103575 00000 0000103804 00000 0000103873 00000 0000104015 00000 0000104040 00000 п 0000104348 00000 п 0000104374 00000 п 0000104703 00000 п 0000104729 00000 п 0000105049 00000 п 0000105745 00000 п 0000105973 00000 п 0000106042 00000 п 0000106184 00000 п 0000106209 00000 п 0000106506 00000 п 0000107230 00000 п 0000107456 00000 п 0000107525 00000 п 0000107668 00000 п 0000107693 00000 п 0000108002 00000 п 0000108028 00000 п 0000108333 00000 п 0000109505 00000 п 0000109733 00000 п 0000109802 00000 п 0000109962 00000 п 0000109987 00000 п 0000110316 00000 п 0000111751 00000 п 0000111982 00000 п 0000112051 00000 п 0000112234 00000 п 0000112259 00000 п 0000112557 00000 п 0000114404 00000 п 0000114795 00000 п 0000122108 00000 п 0000127943 00000 п 0000128195 00000 п 0000130042 00000 п 0000131222 00000 п 0000139419 00000 п 0000139445 00000 п 0000139742 00000 п 0000141589 00000 п 0000142599 00000 п 0000162861 00000 п 0000164708 00000 п 0000165731 00000 п 0000200810 00000 п 0000202657 00000 п 0000204306 00000 п 0000225910 00000 н 0000227758 00000 н 0000228171 0 0000 п 0000235776 00000 п 0000237624 00000 п 0000238019 00000 п 0000245098 00000 п 0000246946 00000 п 0000247383 00000 п 0000258394 00000 п 0000260242 00000 п 0000260421 00000 п 0000260650 00000 п 0000260800 00000 п 0000260870 00000 п 0000261825 00000 п 0000261952 00000 п 0000262022 00000 п 0000262150 00000 п 0000262277 00000 п 0000262804 00000 п 0000262932 00000 п 0000263161 00000 п 0000263303 00000 п 0000263431 00000 п 0000263558 00000 п 0000263685 00000 п 0000263814 00000 п 0000263941 00000 п 0000264069 00000 п 0000264197 00000 п 0000264325 00000 п 0000264453 00000 п 0000264582 00000 п 0000264711 00000 п 0000265037 00000 п 0000265165 00000 п 0000299454 00000 п 0000299709 00000 п 0000300146 00000 п 0000300238 00000 п 0000300291 00000 п 0000300464 00000 п 0000300518 00000 п 0000300672 00000 п 0000300726 00000 п 0000300778 00000 п 0000300830 00000 п 0000300882 00000 п 0000300935 00000 п 0000300988 00000 п 0000301041 00000 п 0000301094 00000 н 0000301147 00000 н 0000301200 00000 н 00003 -

Хеширование рандеву – это алгоритм решения проблемы с распределенной хеш-таблицей — распространенный и общий шаблон в распределенных системах. Проблема состоит из трех частей:

  1. Ключи: уникальные идентификаторы данных или рабочих нагрузок.
  2. Ценности: данные или рабочие нагрузки, потребляющие ресурсы.
  3. Серверы: объекты, которые управляют данными или рабочими нагрузками.


Например, в распределенной системе хранения ключ может быть именем файла, значение — данными файла, а серверы являются сетевыми серверами данных, которые коллективно хранят все файлы. Учитывая ключ и динамический список серверов, задача состоит в том, чтобы сопоставить ключи с серверами при сохранении:

  1. Балансировка нагрузки. Каждый сервер отвечает (приблизительно) за одинаковое количество нагрузок.
  2. Масштабируемость. Мы можем добавлять и удалять серверы без особых вычислительных затрат.
  3. Скорость поиска. Имея ключ, мы можем быстро определить правильный сервер.

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

Введение в хеширование Rendezvous

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

Простой ответ заключается в том, что курсы информатики часто охватывают последовательное хеширование без введения хеширования рандеву, но я думаю, что существует более глубокая основная причина разницы в популярности. В 1999 году компания Akamai Technologies организовала для ESPN игры March Madness и трейлер к фильму Звездные войны: Призрачная угроза. Трейлер был настолько популярен, что из-за трафика сайт киностудии вылетел из строя — веб-кеши Akamai были единственным способом доступа к видео в течение нескольких дней. Это событие вызвало значительный общественный интерес к Akamai, а основным компонентом сети доставки контента Akamai стало согласованное хеширование. Затем в документе DynamoDB 2007 года от Amazon последовательное хеширование рекламировалось как неотъемлемая часть успешной коммерческой базы данных Amazon. Я подозреваю, что рандеву-хеширование менее популярно, потому что у него никогда не было таких моментов «убийственного приложения».

Однако рандеву-хэширование далеко не устарело: инженеры успешно использовали этот алгоритм с 1996 года. На самом деле, похоже, что к хешированию рандеву как к альтернативе согласованному хэшированию вновь возродился интерес. Согласованное хеширование меняет балансировку нагрузки на масштабируемость и скорость поиска, но хеширование рандеву обеспечивает альтернативный компромисс, который делает акцент на равной балансировке нагрузки. За последние несколько лет хеширование рандеву вновь стало хорошим алгоритмом для балансировки нагрузки распределенных систем среднего размера, где стоимость поиска \(O(N)\) не является непомерно высокой.

Почему это называется "Хеширование рандеву"? Мотивация первоначального документа 1996 года заключалась в том, чтобы предоставить поставщику данных способ передавать данные клиенту через прокси-сервер. Для обмена данными клиент и провайдер встречаются — или рандеву — на выбранном прокси-сервере. Хэширование рандеву — это распределенный способ для клиента и поставщика взаимно согласовать место встречи.

Алгоритм хэширования рандеву

Целью хеширования рандеву является обеспечение хорошей производительности балансировки нагрузки. Мы хотим, чтобы каждый сервер отвечал примерно за одинаковое количество пар "ключ-значение". Один из разумных способов сделать это — для каждого ключа равномерно выбрать сервер случайным образом, как в обычной хеш-таблице. Хитрость заключается в том, что если мы просто хешируем ключи к серверам, все хэш-значения меняются при изменении количества серверов.


Хеширование Rendezvous – это разумное решение. Вместо того, чтобы выбирать один сервер, каждый ключ генерирует случайно отсортированный список серверов и выбирает первый сервер из списка. Чтобы гарантировать успешный поиск, мы должны убедиться, что каждая пара ключ-значение управляется первым выбранным сервером ключа. Я называю это свойство инвариантом «первого выбора».

Если наш первый выбор для сервера отключается, мы просто перемещаем ключ на второй сервер в списке (который становится нашим новым первым выбором). Легко видеть, что нам нужно переместить только те ключи, которыми ранее управлял сервер, который отключился. Остальные клавиши перемещать не нужно, так как они по-прежнему управляются по их первому выбору. Например, если бы мы удалили сервер S2 в примере, элементы в S2 переместились бы к своим новым первым выборам: S1 и S3. Однако ни один из других предметов не должен перемещаться, поскольку S2 не был их первым выбором.


Один странный трюк с хешированием

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

Оказалось, что мы можем напрямую применить распространенную технику хеширования для перестановки набора элементов. 1 Сначала мы хэшируем каждый сервер, чтобы получить набор целочисленных хэш-значений. Затем мы сортируем серверы на основе хеш-значений. Результатом является случайно переставленный список серверов. Чтобы гарантировать, что каждый ключ получает уникальную перестановку, мы также должны сделать хеш-функцию зависимой от ключа. Но это несложно — решение состоит в том, чтобы сцепить ключ с каждым сервером или использовать идентификатор сервера в качестве начального числа хеша.


Окончательный алгоритм хеширования рандеву выглядит следующим образом:

  1. Хешировать все возможные комбинации ключей и серверов с помощью случайной хэш-функции
  2. Назначить ключ серверу с наибольшим значением хеш-функции
  3. Сохраняйте инвариант «первого выбора» при добавлении и удалении серверов.

Преимущества хеширования Rendezvous

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

Взвешенные серверы: в некоторых ситуациях мы хотим выполнять предвзятую балансировку нагрузки, а не единообразное случайное назначение ключей. Например, некоторые серверы могут иметь большую емкость, поэтому их следует выбирать чаще. Хеширование Rendezvous очень элегантно размещает взвешенные серверы. Вместо того, чтобы сортировать серверы на основе их хеш-значений, мы ранжируем их на основе \(-\frac<\ln h_i(x)>\), где \(x\) — ключ, \(w_i\) — вес связанный с сервером \(i\), а \(h_i(x)\) — это хеш-значение (нормализованное до [0,1]). Дополнительные сведения см. в слайдах Джейсона Реша с SDC 2015.

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

Недостатки хеширования Rendezvous

Добавление серверов. При добавлении серверов трудно поддерживать инвариант «первого выбора», потому что новый сервер может стать первым выбором для ключа, который уже есть в системе. Чтобы сохранить инвариант, нам нужно убедиться, что все ключи в системе управляются правильным сервером. Это серьезная проблема для распределенных систем хранения и pub/sub, поскольку они направляют пользователей к ресурсам, распределенным по всей системе. Если мы нарушим инвариант, мы нарушим способность находить ресурсы (ценности) в системе.

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

Нам не нужно беспокоиться о добавлении серверов в кеш, поскольку система в конечном итоге сама удовлетворит инвариант «первого выбора». Если мы добавим сервер, который станет первым выбором для существующего ключа, новый сервер просто загрузит соответствующие данные после первого неудачного запроса кэша. Теперь, когда новый сервер отвечает за ключ, старый сервер, который ранее управлял ключом, больше не будет получать запросы на данные. Поскольку большинство кешей удаляют данные на основе LRU (наименее недавно использованных), мы в конечном итоге удаляем все устаревшие копии данных из системы. Это эффективно реализует инвариант «первого выбора», не требуя никаких усилий.

Время запроса: Если у нас есть \(N\) серверов, алгоритм поиска будет \(O(N)\), потому что мы должны проверить все комбинации сервер-ключ. Согласованное хеширование составляет \(O(\log N)\) и может быть намного быстрее, когда \(N\) достаточно велико.

Заключение

Хеширование рандеву — это хороший способ балансировки распределенной нагрузки для распределенных кэшей малого и среднего размера. Если вы работаете с системой, которая в конечном итоге не удовлетворяет инварианту «первый выбор», хеширование рандеву потребует некоторой осторожности при увеличении количества серверов.

Примечания

Тот же прием используется для реализации MinHash, хэш-функции с учетом местоположения. ↩

Моя интуиция подсказывает, что хеш-функция должна быть 2-универсальной, чтобы это было правдой, но я не проверял. \ ↩

Последовательное хеширование хорошо подходит для распределения нагрузки между набором серверов кэширования. То есть, учитывая данные, подлежащие кэшированию, последовательное хеширование использует ключ кэша для определения сервера, которому принадлежат кэшированные данные. Чтобы понять это подробно, начните с кластера из трех серверов кэширования: S1, S2 и S3.

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

При первом запуске кластера исходный набор серверов и их веса известны, возможно, из файла конфигурации или из базы данных. В этом случае предположим, что каждый сервер имеет вес, равный трем. Генерируются и затем хэшируются три различных варианта каждого сервера. Например, первой записью для сервера может быть 1, за которой следуют адрес сервера и порт, следующие 2 следуют за адресом и портом и т. д. Если мы вызовем хэш n-го варианта m-го сервера S m n, то первый хэш первого сервера равен S1 1 , второй хеш первого сервера равен S1 2 . третий хэш третьего сервера — S3 3 .

Следующим шагом в понимании последовательного хеширования является размещение хешированных значений сервера вдоль числовой линии, ограниченной сверху Integer.MAX_VALUE (2 31 -1) и снизу Integer.MIN_VALUE (-2 31 )

Хешированные серверы в числовой строке

Чтобы найти сервер, которому принадлежит определенная пара "ключ-значение" кэша, хэшируйте ключ и найдите первый сервер в числовой строке, который равен или превышает хэш ключа. Таким образом, любой ключ, который хэширует значение между S2 2 и S1 3, будет принадлежать S1.

Мы можем применить эту логику ко всей числовой строке и назначить каждую точку первому серверу, который равен или больше точки. Это представлено ниже, где ключи, попадающие в области, отмеченные зеленым цветом, будут принадлежать S1, ключи, попадающие в область синего цвета, будут принадлежать S2, а ключи, в красную область будет принадлежать S3.

Хешированные серверы формируют ячейки, сопоставляя каждую точку на линии со следующим сервером слева.

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

Если S2 удален, мы можем выполнить тот же процесс, чтобы создать кластер только с S1 и S3. Здесь зеленая область представляет хэш-значения для ключей, которые будут сопоставлены с S1, а красная область представляет хэш-значения для ключей, которые будут сопоставлены с S3.

Хеширование с разным количеством серверов аналогично.

На последних двух рисунках видны два основных преимущества последовательного хеширования. Во-первых, обратите внимание, что любой ключ, который был сопоставлен с S1 или S3 в первом случае, остается связанным с этим сервером, когда хеширование пересчитывается без S2<. /под>. Если сервер присутствует в одном согласованном хеше, а также присутствует в более позднем согласованном хеше с меньшим количеством серверов, то ключи останутся на серверах, которые есть в обоих хешах. Будут перемещены только ключи, которые принадлежали серверам, которые были удалены из согласованного хэша.

Что поднимает второй вопрос. Те ключи, которые перемещаются, распределяются между оставшимися серверами, дополнительная нагрузка не ложится ни на один сервер.

Мы также видим ценность последовательного хеширования при добавлении сервера.

При добавлении нового сервера можно легко найти перераспределенные ключи.

Если S2 добавить обратно в набор, мы можем быстро увидеть, что ключи, перемещенные из S3 в S2, те, где S3 1 < H(K) ≤ S2 1 . Это позволяет сравнительно легко сканировать набор ключей из S3 и загружать все, которые соответствуют этому условию, в S2 как часть процесса приведения S2< /sub> онлайн.

Грегори Л. Хейлеман в университете Аризоны

В ряде недавних работ рассматривалось влияние современных иерархий компьютерной памяти на производительность алгоритмов хеширования (1, 2, 3). Мотивация для написания этих статей связана с последними технологическими тенденциями, которые привели к постоянно увеличивающемуся разрыву между скоростью процессоров и задержкой динамической памяти с произвольным доступом. В результате появился компьютерный фольклор, утверждающий, что худшие хеш-функции с точки зрения количества коллизий, которые они производят, на самом деле могут привести к более высокой производительности, поскольку эти коллизии в основном происходят в кэше, а не в основной памяти. Эта цепочка рассуждений противоположна той, что использовалась для обоснования большинства улучшений, предложенных для хеширования открытых адресов за последние сорок лет. Такие усовершенствования обычно направлены на минимизацию коллизий за счет более случайного распределения элементов данных по хеш-таблице. Действительно, само название «хеширование» должно передавать это понятие (12). Однако сам процесс распределения элементов данных по таблице отрицательно влияет на степень их пространственной локализации в памяти компьютера, тем самым увеличивая вероятность промахов кэша во время длинных последовательностей тестов. В этой статье мы изучаем компромиссы производительности, возникающие при реализации хеш-функции с открытым адресом.

Откройте для себя мировые исследования

  • 20 миллионов участников
  • 135 миллионов публикаций
  • Более 700 тыс. исследовательских проектов
<р>. Следовательно, мы используем двойное хеширование в качестве метода разрешения коллизий. Ожидается, что при двойном хэшировании будет произведено гораздо меньше тестовых последовательностей, чем при линейном зондировании, что действительно сделает его намного быстрее, чем линейное зондирование [25, 42, 43]. В литературе часто утверждается, что на практике линейное зондирование является лучшим выбором, чем двойное хеширование, из-за более эффективного использования кэш-памяти [42]. .

<р>. Ожидается, что при двойном хешировании будет произведено гораздо меньше тестовых последовательностей, чем при линейном зондировании, что действительно сделает его намного быстрее, чем линейное зондирование [25, 42, 43]. В литературе часто утверждается, что на практике линейное зондирование является лучшим выбором, чем двойное хеширование, благодаря более эффективному использованию кэш-памяти [42].Фактически, в литературе линейное зондирование в большинстве случаев имеет преимущество перед двойным хешированием, потому что (i) используется равномерное распределение данных, что дает меньше последовательностей зондирования (как правило, это неверно в нашем случае) и (ii) записи хэш-таблицы очень маленький (поэтому одна строка кэша содержит много записей), и, следовательно, линейное зондирование использует преимущество большего количества попаданий в кэш [42]. .

<р>. В литературе часто утверждается, что на практике линейное зондирование является лучшим выбором, чем двойное хеширование, из-за более эффективного использования кэш-памяти [42]. Фактически, в литературе линейное зондирование в большинстве случаев имеет преимущество перед двойным хешированием, потому что (i) используется равномерное распределение данных, что дает меньше последовательностей зондирования (как правило, это неверно в нашем случае) и (ii) записи хэш-таблицы очень малы (поэтому одна строка кэша содержит много записей) и, следовательно, линейное зондирование использует большее количество попаданий в кэш [42] . Как видно из наших структур хеш-таблиц, длина записи довольно велика, и поэтому в одну строку кэша может поместиться очень мало записей. .

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

<р>. Даже если сканирование охватывает строку кэша, поведение все равно будет лучше, чем второй случайный доступ к памяти на архитектурах с предварительной выборкой. Эмпирические оценки [4, 15, 24] подтверждают практическое преимущество линейного зондирования над другими известными схемами, например, цепочкой, но предостерегают [15,33], что оно ведет себя весьма ненадежно со слабыми хэш-функциями. Взятые вместе, эти результаты формируют сильную мотивацию для теоретического анализа. .

<р>. Даже если сканирование охватывает строку кэша, поведение все равно будет лучше, чем второй случайный доступ к памяти на архитектурах с предварительной выборкой. Эмпирические оценки [4, 15, 24] подтверждают практическое преимущество линейного зондирования перед другими известными схемами, например, цепочкой, но предупреждают [15, 33], что оно ведет себя довольно ненадежно со слабыми хэш-функциями. Взятые вместе, эти результаты формируют сильную мотивацию для теоретического анализа. .

Эти конспекты лекций показывают, что линейное исследование занимает ожидаемое постоянное время, если хеш-функция 5-независима. Этот результат был впервые доказан Pagh et al. [СТОК'07, СИКОМП'09]. Простое доказательство здесь по существу взято из [Patrascu and Thorup ICALP'10]. Лекция является прекрасной иллюстрацией использования высших моментов в структурах данных и может быть использована в курсе по рандомизированным алгоритмам.

<р>. Кэширование эффективно, если ключи имеют небольшую разрядность (т. е. помещаются в компьютерное слово). Используя большие хэш-таблицы и маленькие ключи, эффективность кэширования может компенсировать вероятность большего количества коллизий [8, 36]. Линейное зондирование превосходно, если коэффициент нагрузки ниже 50%, и он все еще конкурентоспособен до коэффициента нагрузки 80% [14,52]. .

Текстовые факторизации Lempel-Ziv 78 ( LZ78 ) и Lempel-Ziv-Welch ( LZW ) популярны не только для простого сжатия, но и для построения сжатых структур данных поверх них. Их регулярная факторная структура делает их вычислимыми в пространстве, ограниченном размером сжатого вывода. В этой статье мы проводим первое тщательное исследование алгоритмов факторизации текста LZ78 и LZW с малым объемом памяти, представляя более эффективные альтернативы классическим методам, а также новые методы, которые могут выполняться в меньшем объеме памяти, чем необходимо для хранения сжатого файл. Наши результаты основаны на хэш-представлении попыток, которые могут представлять независимый интерес.

<р>. Он гарантирует поиск O(1) и превосходную эффективность использования пространства, например, коэффициент загрузки 93% с двумя хеш-функциями и размером корзины 4 [25]. Единственным недостатком хеширования является присущая ему неприязнь к кешу [36], что влечет за собой более высокий штраф за промах кеша в анклаве. Таким образом, при принятии хэширования с кукушкой нам все еще нужен дизайн с учетом кеша. .

Популярной практикой является использование удаленных промежуточных узлов программного обеспечения у сторонних поставщиков услуг.Однако маршрутизация больших объемов необработанного трафика, который может содержать конфиденциальную информацию, на удаленный сайт для обработки вызывает серьезные проблемы с безопасностью. Предыдущие решения часто абстрагируются от важных факторов, имеющих отношение к реальному развертыванию. В частности, они упускают из виду важность защиты метаданных и обработки с отслеживанием состояния. Незащищенные метаданные трафика, такие как низкоуровневые заголовки, размер и количество, можно использовать для изучения предположительно зашифрованного содержимого приложения. Между тем, одновременное отслеживание состояний сотен тысяч потоков часто необходимо в промежуточных устройствах производственного уровня, развернутых в реальных сетях. Мы представляем LightBox, первую систему, которая может управлять внешними промежуточными устройствами почти на исходной скорости, с обработкой с отслеживанием состояния и самой полной защитой на сегодняшний день. LightBox, созданный на основе надежного оборудования Intel SGX, является результатом нашего систематического исследования того, как преодолеть присущие безопасным анклавам ограничения с помощью знаний предметной области и настройки. Во-первых, мы представляем элегантный виртуальный сетевой интерфейс, который обеспечивает удобный доступ к полностью защищенным пакетам на линейной скорости, не выходя из анклава, как из доверенной исходной сети. Во-вторых, мы обеспечиваем полное управление состоянием потока для эффективной обработки с учетом состояния, адаптируя набор структур данных и алгоритмов, оптимизированных для сильно ограниченного пространства анклава. Обширные оценки показывают, что LightBox со всеми преимуществами безопасности может обеспечить пакетный ввод-вывод со скоростью 10 Гбит/с, а с примерами из трех промежуточных блоков с отслеживанием состояния он может работать со скоростью, близкой к исходной.

<р>. Итак, мы используем двойное хеширование в качестве метода разрешения коллизий. Ожидается, что при двойном хэшировании будет произведено гораздо меньше последовательностей зондов, чем при линейном зондировании, что действительно сделает его намного быстрее, чем линейное зондирование (Knuth, 1998; Heileman and Luo, 2005; Tuytelaars and Schmid, 2007). Обратите внимание, что скорость выполнения метода обнаружения неисправности жизненно важна для нашей цели (таким образом, отказ может быть идентифицирован в режиме реального времени), и, следовательно, принимаются вышеуказанные меры. .

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

<р>. В нашей текущей реализации PDB мы использовали линейный вариант открытой адресации для разрешения конфликтов адресов. Хотя этот подход склонен к первичной кластеризации, из-за свойства линейного зондирования, дружественного к кэшу, было показано, что линейное зондирование может превзойти другие хеш-структуры при работе с коэффициентами загрузки 30–70 % (Heileman and Luo, 2005; Black). и др., 1998). Однако производительность линейного зондирования сильно зависит от выбора хорошей хэш-функции. .

Для эффективного решения задач поиска в пространстве состояний часто предпринимаются попытки управлять алгоритмами поиска с помощью эвристики (оценки расстояния от любого состояния до цели). Популярным способом создания эвристических функций является использование абстрактной версии пространства состояний. Однако качество эвристических функций на основе абстракций и, следовательно, скорость поиска могут страдать от ложных переходов, то есть переходов состояний в абстрактном пространстве состояний, для которых не существует соответствующих переходов в достижимом компоненте исходного пространства состояний. Наш первый вклад — это количественное исследование, показывающее, что вредное воздействие ложных переходов на эвристические функции может быть существенным с точки зрения как увеличения числа абстрактных состояний, так и уменьшения эвристических значений, что может замедлить поиск. Наш второй вклад — это эмпирическое исследование преимуществ удаления определенного вида ложных переходов, а именно тех, которые включают состояния с парой взаимоисключающих (мьютексов) присваиваний значений переменных. В контексте планирования пространства состояний пара мьютексов — это пара присваиваний значения переменной, которая не возникает ни в одном достижимом состоянии. Обнаружение пар мьютексов — это проблема, которая часто упоминается в литературе по планированию.Наше исследование показывает, что в некоторых случаях обнаружение мьютекса помогает в значительной степени устранить вредные ложные переходы и, таким образом, существенно ускорить поиск.

<р>. La raison pour laquelle nous utilisons ce type de hachage est qu'il a été démontré qu'il est parmi les méthodes de hachage les plus pratiques. La bonne performance est essentiellement due a la bonne localité des accès memoire [116] . .

Приближенное сопоставление строк — это фундаментальная и повторяющаяся проблема, возникающая в большинстве областей компьютерных наук. Эту задачу можно определить следующим образом: пусть $D=\$ — набор из $d$ слов, определенных в алфавите $\Sigma$, пусть $q$ — запрос, определенный также на $\Sigma$, и пусть $k$ — натуральное число. Мы хотим построить структуру данных на $D$, способную ответить на следующий запрос: найти все слова в $D$, которые не более чем отличаются от слова запроса $q$ с $k$ ошибками. В этой диссертации мы изучаем методы приближенного сопоставления строк в словарях, текстах и ​​указателях, чтобы предложить практические методы, которые эффективно решают эту проблему. Мы исследуем эту проблему в трех взаимодополняющих направлениях: 1) Приближенное сопоставление строк в словаре. Мы предлагаем два решения этой проблемы, первое использует хеш-таблицы для $k \geq 2$, второе использует Trie и обратное Trie, и оно ограничено (k = 1). Два решения адаптируются без потери производительности к приблизительному сопоставлению строк в тексте. 2) Приблизительное сопоставление строк для \textit, то есть поиск всех суффиксов заданного префикса, которые могут содержать ошибки. Мы даем новое решение лучше на практике, чем все предыдущие предложенные решения. 3) Задачу выравнивания биологических последовательностей можно интерпретировать как задачу приближенного сопоставления строк. Мы предлагаем решение для сверстников и выравнивания нескольких последовательностей. \medskip Все полученные результаты показали, что наши алгоритмы дают наилучшую производительность на наборах практических данных (эталоны из реального мира). Все наши методы предлагаются в виде библиотек и публикуются в Интернете.

<р>. Хеш-таблицы [17] Сама по себе хэш-таблица является абстрактным понятием, и существуют различные варианты реализации, требующие различных подходов к распараллеливанию. Наилучшая производительность наблюдается, когда хеш-таблица использует в качестве внешнего хранилища массивы [18, 19, 20], что потребует структурных изменений в случае неблокирующей реализации. .

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

Мы представляем первое тщательное практическое исследование вычислений Лемпеля-Зива-78 и Лемпеля-Зива-Уэлча на основе треугольных структур данных. Тщательно выбрав представления в виде дерева, мы сможем превзойти хорошо настроенные популярные структуры данных в виде дерева, такие как Judy, m-Bonsai или Cedar.

Твердотельные накопители (SSD) на основе флэш-памяти NAND становятся жизнеспособной альтернативой в качестве вторичного решения для хранения данных для многих вычислительных систем. Поскольку физические характеристики флэш-памяти NAND отличаются от обычных жестких дисков (HDD), твердотельные накопители на основе флэш-памяти обычно используют промежуточный программный уровень, называемый уровнем преобразования флэш-памяти (FTL). FTL использует несколько встроенных алгоритмов для преобразования логики в физическую, чередования ввода-вывода, сборки мусора, выравнивания износа и т. д. Эти алгоритмы FTL не только сильно влияют на производительность и срок службы хранилища, но также определяют стоимость оборудования и целостность данных. В целом, гибридная схема FTL широко используется в мобильных устройствах, поскольку она демонстрирует высокую производительность и высокую целостность данных при низкой стоимости оборудования. В последнее время в высокопроизводительных твердотельных накопителях быстро внедряется FTL на основе спроса, основанный на сопоставлении уровня страниц.FTL на основе запроса более эффективно использует параллелизм на уровне устройства, чем гибридный FTL, и требует небольшого объема памяти, сохраняя в DRAM только популярные записи сопоставления. Однако из-за этого механизма кэширования FTL на основе запроса недостаточно устойчив к сбоям питания и требует дополнительных операций чтения для извлечения отсутствующих записей сопоставления из флэш-памяти NAND. В этой статье мы предлагаем новый слой флэш-перевода под названием LAST++. Предлагаемая схема LAST++ основана на гибридной FTL, поэтому она обладает присущими гибридной FTL преимуществами, включая низкие требования к ресурсам, высокую устойчивость к сбоям питания и высокую производительность чтения. Эффективно используя локальность ссылок ввода-вывода, LAST++ увеличивает параллелизм на уровне устройств и снижает накладные расходы на сборку мусора. Это приводит к значительному улучшению производительности ввода-вывода и позволяет преодолеть ограничения гибридного FTL. Наши экспериментальные результаты показывают, что LAST++ превосходит FTL на основе запроса на 27% для записи и на 7% для чтения в среднем, обеспечивая при этом более высокую устойчивость к внезапным сбоям питания. LAST++ также повышает производительность записи в среднем на 39 % по сравнению с существующим гибридным FTL.

Читайте также: