我的程序已經評估了數以百萬計的記錄。所以記憶和表現的問題很重要。 讓每條記錄都有key - ticketID。還有記錄有字段值和字段source_name。 在源ticketID中有1到多個(neary 100)source_name。 我只需要通過ticketID聚合 - 接收近100萬條記錄,但也必須有可能性減去指定source_name的值 - 所以我有跟蹤的貢獻。用於跟蹤彙總值部分的Java算法
是否存在一些算法或數據結構可以解決這個問題?
我的程序已經評估了數以百萬計的記錄。所以記憶和表現的問題很重要。 讓每條記錄都有key - ticketID。還有記錄有字段值和字段source_name。 在源ticketID中有1到多個(neary 100)source_name。 我只需要通過ticketID聚合 - 接收近100萬條記錄,但也必須有可能性減去指定source_name的值 - 所以我有跟蹤的貢獻。用於跟蹤彙總值部分的Java算法
是否存在一些算法或數據結構可以解決這個問題?
我不能完全解析問題完全,所以我會假設:
ticketID
領域。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);
}
如果您編輯的問題,我將修改我如果我做了一些不正當的假設,我會回答。
聽起來像是一種繁重的舉動讓數據庫可以做... – claymore1977
http://www.sqlite.org/ – agibalov
爲什麼不建議一種算法,並討論哪種方法對提高速度至關重要?沒有一種算法不會將某些東西換成別的東西,並且從描述中只存在一個模糊的問題概念。 –