在这种情况下,最好使用数据库或读取文件来提高性能?

时间:2013-04-24 15:05:04

标签: java database performance file

这个我的类TagVertex包含一个从文本文件中读取标记value = string的方法

并将其退回

    public class TagVertex extends Vertex<String> {

    @Override
    public String computeVertexValue() {
    String s = null;
    try {
        BufferedReader bf = new BufferedReader(new FileReader(MyDataSource.TagList1K));

      for(int i = 1; i < Integer.parseInt(this.getVertexId().substring(this.getVertexId().indexOf("g")+1)); i++){
          bf.readLine();
      }
      s= bf.readLine();
      bf.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
            this.setVertexValue(s);

    return  s;
        }

该方法被调用1000次==&gt;该文件也被读取1000次

最好使用数据库而不是文本文件?

2 个答案:

答案 0 :(得分:2)

访问硬盘始终是一个非常慢的操作。数据库通常也访问硬盘驱动器,因此它们不一定更快。它们可能更慢,因为当数据库不在同一系统上运行时,会添加网络延迟(即使它在localhost上运行,也会因进程间通信而产生延迟)。

我建议你一次读取文件并缓存值。当您需要立即注意文件更改时,您可以使用新的WatchService API在文件更改时重新加载。 Here is a tutorial。如果立即注册文件系统级别的更改并不重要,您还可以节省从硬盘驱动器读取顶点信息的时间,并且只在超过几秒钟时重新读取该值。

答案 1 :(得分:2)

您可以像这样创建自己的内存数据库。

private static final List<String> lines = new ArrayList<>();

@Override
public String computeVertexValue() {
    if (lines.isEmpty())
        try {
            BufferedReader br = new BufferedReader(new FileReader(MyDataSource.TagList1K));
            for (String line; (line = br.readLine()) != null; )
                lines.add(line);
            br.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    return lines.get(Integer.parseInt(this.getVertexId().substring(this.getVertexId().indexOf("g") + 1)));
}