【问题标题】:Dictionary: hard-coded vs. external file字典:硬编码与外部文件
【发布时间】:2013-05-02 19:52:30
【问题描述】:

我有一个 java 应用程序,它每秒启动和停止数亿个项目(从外部脚本调用)多次。

Input: String key
Output: int value

此应用程序的目的是在永远永远更改的Map(约 30k 个键)中查找某个键并返回该值。很简单。

问题:每秒多次使用什么更有效:

  1. Map 中的硬编码字典
  2. 使用BufferedReader 读取外部文件
  3. ...让我惊叹你的其他想法

我知道硬编码是邪恶的,但有时,你需要邪恶才能高效:-)

【问题讨论】:

  • 最好有动态地图,以便轻松访问您的 Java 应用程序。
  • 使用数据库是一种选择?
  • 你为什么这么频繁地启动和停止应用程序?为什么不让它继续运行并根据需要处理请求?
  • 这里的问题是您重新启动 Java 应用程序数亿次。启动开销可能是处理时间的 99%。您需要重新考虑一些事情,以便您的应用可以通过管道或套接字为请求提供服务,并且只启动一次。

标签: java performance dictionary coding-style hardcode


【解决方案1】:

从文件中读取字典。将其存储在Map 中。将您的 Java 应用程序设置为连续运行的服务(因为您说它每秒被调用多次)。然后你的Map 将被缓存在 RAM 中。

【讨论】:

    【解决方案2】:

    最快的是内存中的硬编码映射。 如果你有一个很大的文件,你可以使用内存映射文件:

    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 行,清理缓冲区并读取更多内容。

    【讨论】:

      【解决方案3】:

      我会在应用程序启动时将文件加载到Map,然后按照您的描述使用它。

      我会将数据存储在数据库中以加快加载速度。

      绝对不用每次调用都启动和关闭应用程序;将其作为等待IO的服务,使用异步I/O,如netty

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-25
        • 2013-07-08
        • 2015-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多