2011-10-04 27 views
0

我的程序已經評估了數以百萬計的記錄。所以記憶和表現的問題很重要。 讓每條記錄都有key - ticketID。還有記錄有字段值和字段source_name。 在源ticketID中有1到多個(neary 100)source_name。 我只需要通過ticketID聚合 - 接收近100萬條記錄,但也必須有可能性減去指定source_name的值 - 所以我有跟蹤的貢獻。用於跟蹤彙總值部分的Java算法

是否存在一些算法或數據結構可以解決這個問題?

+0

聽起來像是一種繁重的舉動讓數據庫可以做... – claymore1977

+0

http://www.sqlite.org/ – agibalov

+1

爲什麼不建議一種算法,並討論哪種方法對提高速度至關重要?沒有一種算法不會將某些東西換成別的東西,並且從描述中只存在一個模糊的問題概念。 –

回答

2

我不能完全解析問題完全,所以我會假設:

  • 「近100萬的記錄」意味着有近100萬獨特ticketID領域。
  • 「近100個」不同source_name s在系統中。
  • 並非所有ticketId都有source_name s。我們沒有100萬ticketID x source_name的組合。
  • 您希望能夠總計所有的ticketId s,但也總計source_name

有了這些假設,我會使用Map的地圖。外部Map有一個密鑰source_name和內部Map的值。內部Map有一個密鑰ticketId和一個累積value

所以僞代碼看起來是這樣的:

Map<String, Map<Integer,Double>> valueMap = 
    new HashMap<String, Map<Integer,Double>>(); 

while (...reading in and processing data...) { 
    int ticketId = ...; 
    String sourceName = ...; 
    double entryValue = ...; 

    Map<Integer,Double> sourceNameMap = valueMap.get(sourceName); 
    Double value = sourceNameMap.get(ticketId); 
    if (oldValue == null) { 
     value = entryValue; 
    } else { 
     value += entryValue; 
    } 
    sourceNameMap.put(ticketId, value); 
} 

您可以輕鬆地添加了每個source_name地圖得到總。當然如果有幫助的話,你也可以保持每個source_name的運行總數。如果您的系統可以爲JVM分配一個千兆字節,那麼它應該能夠處理好數量的ticketID x source_name對。

你可能會考慮創建一個可變的內部值類,以節省GC週期:

private static class MutableValue { 
    double value; 
    public MutableValue(double value) { 
     this.value = value; 
    } 
    public void add(double value) { 
     this.value += value; 
    } 
} 

,那麼你可以說:

MutableValue value = sourceNameMap.get(ticketId); 
if (oldValue == null) { 
    sourceNameMap.put(new MutableValue(entryValue)); 
} else { 
    value.add(entryValue); 
} 

如果您編輯的問題,我將修改我如果我做了一些不正當的假設,我會回答。