Лучший способ хранения огромного списка с хэшами в Javascript
У меня есть список из 10.000 записей.
, например
myList = {};
myList[hashjh5j4h5j4h5j4]
myList[hashs54s5d4s5d4sd]
myList[hash5as465d45ad4d]
....
Я не использую массив (0,1,2,3), потому что я могу проверить
очень быстро
→ если этот хэш существует или нет.
if(typeof myObject[hashjh5j4h5j4h5j4] == 'undefined')
{
alert('it is new');
}
else
{
alert('old stuff');
}
Но я не уверен, это хорошее решение?
Может быть, проблема в обработке объекта с 10.000 записей?
РЕДАКТИРОВАТЬ:
Я пытаюсь создать rss-канал, который показывает только новые каналы. Поэтому я вычисляю хэш из ссылки (каждая новость имеет ссылку uniqe) и сохраняет ее в объекте (mongoDB). BTW: 10.000 записей - это не обычный случай (но это возможно)
Ответы
Ответ 1
Мой совет:
- Используйте как можно меньше хэша для задачи. Если вы имеете дело с сотнями хешируемых строк, то по сравнению с миллиардами, ваша длина хэша может быть относительно небольшой.
- Сохраняйте хэш как целое число, а не строку, чтобы избежать необходимости занимать меньше места, чем нужно.
- Не хранить как объекты, просто хранить их в простом двоичном древе log2 (keySize) глубоко.
Дальнейшие мысли:
- Можете ли вы прийти к этому с помощью гибридного подхода? Используйте хеши для последних фидов менее месяца, и не беспокойтесь, показывая предметы, которые больше месяца. Храните хэш и дату вместе, и очищайте старые хеши каждый день?
Ответ 2
Вы можете использовать оператор in
:
if ('hashjh5j4h5j4h5j4' in myList) { .. }
Однако это также вернет true
для членов, которые находятся в цепочке прототипов объектов:
Object.prototype.foo = function () {};
if ("foo" in myList) { /* will be true */ };
Чтобы исправить это, вы можете использовать hasOwnProperty
:
if (myList.hasOwnProperty('hashjh5j4h5j4h5j4')) { .. }
Пока вы, возможно, не добавляли методы Object.prototype
, вы не можете гарантировать, что другие сторонние библиотеки, которые вы используете, не имеют; кстати, расширение Object.prototype
неодобрительно, поэтому вы не должны этого делать. Почему; потому что вы не должны изменять то, что вам не принадлежит.
Ответ 3
10.000 довольно много. Вы можете рассмотреть возможность хранения хешей в базе данных и запросить его с помощью ajax. Возможно, потребуется немного больше времени, чтобы запросить один хэш, но ваша страница загружается намного быстрее.
Ответ 4
Это не проблема в современном браузере на современных компьютерах.
10 тыс. записей, которые занимают до 50 байт, по-прежнему занимают менее 500 КБ памяти.
Пока js обслуживается gzipped, тогда пропускная способность не проблема - но постарайтесь как можно раньше обслуживать данные, чтобы они не блокировали воспринимаемую производительность pageload.
В целом, если вы не хотите обслуживать мобильные телефоны, тогда ваше решение будет прекрасным.