Я пытаюсь закодировать для нашего сервера, где я должен найти тип доступа пользователей по URL-адресу.Проект Java: Сделать производительность HashMap (включая загрузку) Лучше
Теперь, в начале, мы видим, что каждый день доступны 100 миллионов различных URL-адресов. Теперь, к тому времени, он стал почти 600 миллионов разных URL-адресов в день.
За 100 миллионов, что мы сделали это следующее:
1) Построение HashMap, используя параллельный массив, ключ являются URL в одной части (представлены в виде LONG) и значение другой часть URL-адрес (представлен как INT) - ключ может иметь несколько значений.
2) Затем найдите HashMap, чтобы узнать, сколько URL-адресов времени.
Теперь, как HashTable укрупняются, что мы сделали следующий:
1) Построить два/три отдельных HashTable и нагрузки и хранить его (в общей файловой системы), чтобы найти, сколько раз URL доступ.
Теперь вопрос,
1) Хотя HashTable производительность довольно хорошо, код занимает больше времени при загрузке/хранения HashTable (мы используем File Channel, занимает 16-19 секунд, чтобы загрузить/магазин HashTable - 200 миллионов entry-, как коэффициент загрузки 0,5)
Что мы пытаемся спросить:
1) Любой комментарий, как решить эту проблему?
2) Как уменьшить время загрузки/хранения (я спросил раньше, но кажется, что File Channel - лучший способ)?
3) Является ли хранение большого HashTable (более памяти) и его кеширование неоднократно будет хорошим решением? Если да, то как это сделать (по крайней мере, некоторые указатели). Мы попробовали его, используя
RandomAccessFile raf = new RandomAccessFile("array.dat", "rw");
IntBuffer map = raf.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, 1 << 30).order(ByteOrder.nativeOrder()).asIntBuffer();
Однако, это дает более высокую производительность, чем предыдущая.
Спасибо.
NB:
1) В соответствии с предыдущими предложениями Stack Overflow, мы используем некоторые NoSQL БД как TokyoCabinet но из нашего опыта, обычай HashTable дает лучшую производительность, чем это на 100 миллионов пар ключ-значение.
2) Предварительно прочитанные данные для кэширования дисков невозможны, поскольку при запуске системы наше приложение начнет работать и на следующий день при запуске системы.
Что мы забыли упомянуть:
1) Как наше приложение является частью проекта и будет применяться на небольшом университетском городке, поэтому мы предполагаем URL доступ не более чем 800 миллионов человек. Таким образом, вы можете думать, что значение 600/700 данных фиксировано.
2) Наша основная забота - производительность.
3) Мы должны запускать наше приложение локально.
Edit: code of our hashmap can be found here.
@Hans, Tokyo/Kyoto шкаф. Слишком медленно. – Arpssss
Может ли быть тонны значений на ключ? Звучит как хеш-таблица, в которой хранятся списки ints –
Попробуйте что-то вроде Coherence или Terracotta. Написание чего-то по своему усмотрению вряд ли получится. – duffymo