【发布时间】:2014-10-20 05:03:23
【问题描述】:
我正在做一个可以产生无限数量的数字的项目
<More on this>: Threading Isues With Fixed Thread Pool and Large Number of Tasks 我已经成功地解决了它所涉及的线程问题。另外,我决定将排序器的结果存储在硬盘上,这样我就可以计算更多的数字(并确保它们都收敛到 1),每次存储结果的HashMap 达到时我都会这样做400,000(我的电脑上一个合理的大小,大约 1GB/8GB)键/值对,然后加载下一个 400,000。假设值是FinalSequencerReports,随着值越来越大,趋向于∞,存储的值最终应该会超过我的 RAM 容量,有没有办法绕过这个限制(或者甚至是多少我会甚至会遇到存储400,000 实例将超出我的RAM 容量的情况?或者任何RAM 容量的公式?)注意:在FinalSequencerReport 类中有一个String,它将始终为空。
类被存储在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,因为在合理的时间内离开long范围没有任何变化。请注意,BigInteger会大大降低计算速度。
标签: java multithreading performance math recursion