我有一个java应用程序,它每秒多次启动和停止数亿项(从外部脚本调用)。
Input: String key
Output: int value
此应用程序的目的是在永远曾经更改Map
(〜30k键)中查找某个键并返回该值。很容易。
问题:每秒多次使用时效率更高:
- 中的硬编码字典
Map
- 使用
读取外部文件BufferedReader
- ...让我惊讶于你的其他想法
醇>
我知道硬编码是邪恶但有时候,你需要变得邪恶才能提高效率: - )
答案 0 :(得分:2)
从文件中读入字典。将其存储在Map
中。将Java应用程序设置为连续运行的服务(因为您说它每秒被调用多次)。然后你的Map
将被缓存在RAM中。
答案 1 :(得分:1)
最快的是内存中的硬编码地图。 如果您有一个巨大的文件,您可以使用内存映射文件:
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行清理缓冲区并阅读更多内容。
答案 2 :(得分:0)
我会在启动应用程序时将文件加载到Map
,然后按照您的描述使用它。
我会将数据存储在数据库中,以加快加载速度。
每次调用时,绝对没有应用程序启动和关闭;将它作为等待IO的服务,使用异步I / O,例如netty