내가 꽤 나는 가정합니다 완전히 질문을 구문 분석 할 수 없습니다 :
- "거의 1 백만 기록"거의 1 백만 독특한
ticketID
필드가 있음을 의미합니다.
- 시스템에서 "거의 100"이 다릅니다.
source_name
- 모두
ticketId
은 source_name
s이다. 우리는 1 억 1 천 2 백x source_name
조합을 가지고 있지 않습니다.
ticketId
을 모두 합계 할 수 있고 합계는 source_name
입니다.
이러한 가정에서는 Map
개의지도를 사용합니다. 바깥 쪽 Map
에는 source_name
의 키와 Map
의 값이 있습니다. 내부 Map
에는 ticketId
키와 누적 value
키가 있습니다. 당신은 쉽게 source_name
지도의 각을 추가하여 총을 얻을 수
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
의 누적 합계를 유지할 수도 있습니다. 시스템이 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);
}
내 부적절한 가정을 한 경우를 대비하여 대답합니다.
무거운 물건을 들어 올리는 것과 같은 소리로 DB를 할 수 있습니다 .... – claymore1977
http://www.sqlite.org/ – agibalov
알고리즘을 제안하고 속도를 향상시키는 데 중요한 방법을 토론하는 이유는 무엇입니까? 다른 것과 무언가를 교환하지 않는 알고리즘은 없습니다. 설명에서 막연한 모호한 개념 만 존재합니다. –