Словарь: жестко закодированный и внешний файл

У меня есть java-приложение, которое запускается и останавливается несколько раз в секунду для сотен миллионов элементов (вызывается из внешнего скрипта).

Input: String key
Output: int value

Целью этого приложения является поиск определенного ключа в никогда когда-либо меняющемся Map (~30 тыс. ключей) и возврат значения. Очень просто.

Вопрос: что эффективнее при использовании несколько раз в секунду:

  1. жестко запрограммированный словарь в Map
  2. Прочитать внешний файл с BufferedReader
  3. ...поразите меня своими идеями

Я знаю, что жесткое кодирование — это зло, но иногда нужно быть злым, чтобы быть эффективным :-)


person ATN    schedule 02.05.2013    source источник
comment
Было бы лучше иметь карту на лету для быстрого доступа к вашему приложению Java.   -  person Luiggi Mendoza    schedule 02.05.2013
comment
Использование базы данных является вариантом?   -  person Mohammad Adil    schedule 02.05.2013
comment
Почему вы так часто запускаете и останавливаете приложение? Почему бы просто не оставить его работающим и обрабатывать запросы по мере необходимости?   -  person dlev    schedule 02.05.2013
comment
Проблема здесь в том, что вы перезапускаете свое Java-приложение сотни миллионов раз. Накладные расходы при запуске, вероятно, составят 99% времени обработки. Вам нужно все переосмыслить, чтобы ваше приложение могло обслуживать запросы через канал или сокет и запускаться только один раз.   -  person Jim Garrison    schedule 02.05.2013


Ответы (3)


Читать в словаре из файла. Сохраните его в Map. Настройте свое Java-приложение как службу, которая работает непрерывно (поскольку вы сказали, что она вызывается много раз в секунду). Тогда ваш Map будет кэширован в оперативной памяти.

person KyleM    schedule 02.05.2013

Самая быстрая — жестко запрограммированная карта в памяти. если у вас есть огромный файл, вы можете использовать файл с отображением памяти:

MappedByteBuffer in = new FileInputStream("map.txt").getChannel().map(
FileChannel.MapMode.READ_ONLY, 0, LENGTH);
StringBuilder bs = new StringBuilder();
//read 1/4 of the file   
while (i < LENGTH/4)
      bs.append((char)in.get(i++));

Однако этот подход немного проблематичен, на практике вы захотите разбить файл на разрывы строк, т.е. читать до тех пор, пока 100-я строка не очистит буфер и не прочитает еще немного.

person firephil    schedule 02.05.2013

Я бы загрузил файл в Map при запуске приложения, а затем использовал его, как вы описываете.

Я бы сохранил данные в базе данных для более быстрой загрузки.

Определенно не запускать и выключать приложение каждый раз, когда оно вызывается; используйте его как службу, ожидающую ввода-вывода, используя асинхронный ввод-вывод, например netty

person durron597    schedule 02.05.2013