这个我的类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次
最好使用数据库而不是文本文件?
答案 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)));
}