Быстро находящиеся на диске хеш-таблицы?

Легкий способ упорядочить результат после того, как mongo возвращает массив, состоит в том, чтобы сделать объект с идентификатором в качестве ключей, а затем отобразить на заданный _id, чтобы вернуть упорядоченный массив.

async function batchUsers(Users, keys) {
  const unorderedUsers = await Users.find({_id: {$in: keys}}).toArray()
  let obj = {}
  unorderedUsers.forEach(x => obj[x._id]=x)
  const ordered = keys.map(key => obj[key])
  return ordered
}
21
задан taw 30 January 2009 в 11:04
поделиться

5 ответов

Вот решение, которое я в конечном счете использовал:

  • Один файл на набор
  • Файл содержит 2^k блоки, каждый 256 байтов или 32 записи 8 байтов
  • , Пустые записи просто обнуляются (000... допустимый хеш, но я не забочусь о 2^-64 шанс коллизии, если все уже может столкнуться со всем остальным по природе хеширования).
  • Каждый хеш находится в блоке, предполагаемом через его первые k биты
  • , Если какой-либо блок переполняет, двойной размер файла и разделил каждый блок
  • , ко Всему получают доступ через mmap (), не чтение () / запись ()

, Это просто невероятно быстрее, чем sqlite, даже при том, что это - код Perl низкого уровня, и Perl действительно не предназначен для высокопроизводительных баз данных. Это не будет работать ни с чем, что это менее равномерно распределено, чем MD5, его предположение, что все будет чрезвычайно универсально для хранения реализации простой.

я попробовал его, ищут ()/sysread ()/syswrite () сначала, и это было очень медленно, mmap (), версия действительно намного быстрее.

15
ответ дан 29 November 2019 в 20:59
поделиться

Я испытал некоторые затруднения при изображении точной проблемы/потребности, но это все еще получило меня думающий о Мерзавце и как это хранит SHA1-ссылки на диске:

Берут представление шестнадцатеричной строки данного хеша, скажем, "abfab0da6f4ebc23cb15e04ff500ed54". Прервите два первых символа в хеше (" ab", в нашем случае), и превратите его в каталог. Затем используйте остальных (" fab0da6f4ebc23cb15e04ff500ed54"), создайте файл и поместите материал в него.

Таким образом, Вы получаете довольно достойную дисковую производительность (в зависимости от Вашего FS, естественно) с автоматическим индексированием. Кроме того, Вы получаете прямой доступ к любому известному хешу, только путем втискивания разделителя каталога после двух первых символов (" ./ab/fab0da [..]")

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

10
ответ дан 29 November 2019 в 20:59
поделиться

Походит на задание для Беркли DB .

6
ответ дан 29 November 2019 в 20:59
поделиться

Два алгоритма появляются по моему мнению сначала:

  • Использование B-дерево .
  • Отдельная цепочка сами хеши путем выполнения чего-то как использование первых 10 битов хеша, которые индексируют в один из 1 024 отдельных файлов, каждый из которых содержит отсортированный список всех хешей, запускающихся с тех 10 битов. Это дает Вам постоянно-разовый переход в блок, который должен вписаться в память и журнал (n) поиск, после того как Вы загрузили тот блок. (или Вы могли использовать 8 битов для хеширования в 256 файлов, и т.д.)
1
ответ дан 29 November 2019 в 20:59
поделиться

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

0
ответ дан 29 November 2019 в 20:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: