parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Большой hashfile - как правильно работать и где подстелить соломку

Webnode 24.10.2012 21:29

Добрый день!
Недавно открыл для себя hashfile, а было так, что 'упёрся' в производительность на VPS при использовании MySQL на простой операции - преобразование бессмысленного для посетителя sha1 хеша во вполне правильный URL для редиректа. Типа так:
hash1 -> url1
...
hashn -> urln
Длина ключа как-то не очень помогала, а sha1 вид ключей для url - историческое наследие. Пробовал кодировать 160 бит в три BIGINT и делать их первичным ключом - помогло слабо, всё равно было около секунды на операцию.

Тут-то и пришел на помощь hashfile, прирост в скорости был более 20 раз!
Недолго музыка играла - проект обновился и элементов стало ок. 6 млн. Бэкэнд на Win32, на нём всё считалось и потом копировалось с молниеносным переименованием на фронт. Средний размер записи - 40 байт хеш + 86 байт url = 126 байт без накладных расходов.

Проблема в следующем - при количестве ключей около 4,5 млн. наступает unhandled exception, с выдачей окошка gc, что в heap ничего не осталось. Понял, что зараз нельзя вгонять и таблицу и хеш в пямять, писал так - "загрузить таблицу с диска, в menu пробежаться по всем элементам, и если нет в hashfile - то добавить, по окончанию освободить hashfile". Памяти при этом кушалось около 800мб. и всё умирало.

Решил вопрос записи следующим образом - грузил и писал по 500 000 записей, получилось очень быстро, 3 минуты и готово.

Но есть вопросы:
1. Можно ли как-то ещё быстро и не так криво загрузить большой hashfile?

2. Что делать когда захочется обратно всё ключи достать? Ведь при foreach вылетает такая же ошибка, т. е. моё решение "в один конец" если что с основной базой - только восстановление из бэкапа, hashfile непригоден для массового доставания из него данных, по ссылочке - это супер, спасибо авторам. Конечно, тут возможно amd64 поможет или x64 если под винды (а будет ли когда?), кто-нибудь сталкивался с таким вопросом?

3. Какой вообще предел по количеству записей? 10млн? 100млн? Что мне ждать такому довольному перфекционисту в будущем?

Спасибо!