我正在開發一個項目,可以生成無限數量的數字 <More on this>
:Threading Isues With Fixed Thread Pool and Large Number of Tasks我已經成功地解決了涉及到的線程問題。另外,我決定將音序器的結果存儲在硬盤上,這樣我就可以計算更多的數字(並確保它們都收斂到1),每當存儲結果的HashMap
達到400,000
(在我的電腦上合理的尺寸,大約1GB/8GB)鍵/值對,然後在下一個400,000
加載。假設值爲FinalSequencerReport
s,因爲值越來越大趨於∞
存儲的值應該最終超過我的RAM容量,有沒有辦法繞過這個限制(甚至是什麼數字我甚至會遇到一種情況哪裏存儲400,000
實例將超過我的RAM容量?或者任何RAM容量的公式?)注意:在FinalSequencerReport
類中有一個String
,它將始終爲空。何時將存儲要求超過系統中的RAM,以便不斷計算更高的值並將其存儲在磁盤上?
類存儲在HashMap<BigInteger, FinalSequencerReport<BigInteger>>
:
public static final class FinalSequencerReport<T extends Number> extends SequencerReport<T> implements Comparable<FinalSequencerReport<T>> {
public static Comparator<? super FinalSequencerReport<? extends Number>> compareByInitialValue() {
return (FinalSequencerReport<? extends Number> o1, FinalSequencerReport<? extends Number> o2)
-> new BigInteger(o1.getInitialValue().toString()).compareTo(new BigInteger(o2.getInitialValue().toString()));
}
private final T initialValue;
private final String finalFormattedString;
public FinalSequencerReport(SequencerReport<T> finalReport, T initialValue) {
super(finalReport.getResult(), finalReport.getIterations(), finalReport.getSequence());
this.initialValue = initialValue;
this.finalFormattedString = "Initial Value: "
+ getInitialValue() + "\nFinal Value: " + getResult() + "\nIterations: "
+ getIterations() + "\nAlgebraic Sequence:\n" + getSequence();
}
public String getFinalFormattedString() {
return this.finalFormattedString;
}
public Number getInitialValue() {
return this.initialValue;
}
@Override
public int compareTo(FinalSequencerReport<T> o) {
return FinalSequencerReport.compareByInitialValue().compare(this, o);
}
}
public static class SequencerReport<T extends Number> {
private final T result, iterations;
private final String sequence;
public SequencerReport(T result, T iterations) {
this(result, iterations, "");
}
public SequencerReport(T result, T iterations, String sequence) {
this.result = result;
this.iterations = iterations;
this.sequence = sequence;
}
public T getResult() {
return this.result;
}
public T getIterations() {
return this.iterations;
}
public String getSequence() {
return this.sequence;
}
}
如果要計算所有結果順序,那麼就沒有必要使用'BigInteger',因爲沒有變化在合理的時間內離開「長期」範圍。請注意,'BigInteger'減慢了計算的一個重要因素。 – maaartinus 2014-10-19 22:50:56