2013-04-24 36 views
1

這是我的類TagVertex包含讀取標籤值的一個方法=字符串從文本文件在這種情況下,最好使用數據庫或讀取文件來提高性能?

並返回

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次==>文件被讀1000次太

最好使用數據庫而不是文本文件?

+3

個人而言,我只希望緩存結果所有文件+寫一段代碼來監視文件系統的變化和更新緩存文件時更改(新的Java 7 API) – radai 2013-04-24 15:09:14

+0

你能解釋更多的想法? – nawara 2013-04-24 15:14:03

+0

基本上在你的案例中,頂點值是存儲在一個文件/文件中的。讀取所有文件並在內存中保存值的HashMap或其他內容。假設你有足夠的內存(在大多數機器上應該可以很好地擴展到大約1M條),它是最快的解決方案。現在你只需要擔心文件被改變/編輯 - 如果這是可能的。如果可能的話,你需要觀察文件的變化,如果它改變了刷新並重新加載你的HashMap。看看這裏 - http://e-blog-java.blogspot.com/2011/03/how-to-watch-file-system-for-changes-in.html – radai 2013-04-24 15:18:47

回答

2

訪問硬盤驅動器總是非常慢的操作。數據庫通常也可以訪問硬盤,所以它們不一定更快。它們可能會更慢,因爲當數據庫不在同一系統上運行時,會增加網絡延遲(即使它運行在本地主機上,由於進程間通信也會產生延遲)。

我建議你一次讀取文件並緩存該值。當文件更改時需要立即注意到時,可以使用新的WatchService API在文件更改時重新加載文件。 Here is a tutorial。如果立即註冊文件系統級別的變化並不重要,則還可以節省從硬盤驅動器讀取頂點信息的時間,並且只在數秒以前重新讀取該值。

+0

+1我也會緩存的長度該文件而不是爲每一行調用'parseInt'。 – 2013-04-24 15:59:33

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))); 
} 
+0

有什麼區別? **每行調用'computeVertexValues'方法會創建**行 – nawara 2013-04-24 16:23:45

+1

'lines'只會被創建一次,因爲它是'static final'。一旦文件中有內容,這些行不會再爲空,並且不會再被讀取(儘管在更改之後這可能是可取的) – 2013-04-24 18:43:10

相關問題