2014-10-19 23 views
1

我正在開發一個項目,可以生成無限數量的數字 <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; 
    } 

} 
+0

如果要計算所有結果順序,那麼就沒有必要使用'BigInteger',因爲沒有變化在合理的時間內離開「長期」範圍。請注意,'BigInteger'減慢了計算的一個重要因素。 – maaartinus 2014-10-19 22:50:56

回答

2

您需要定期check the available HDD space,搭配一個RAM check - 我建議往往比HDD多檢查RAM。

如果要估計空間使用量,可以使用approximate the size of your objects,但要注意:由於對象的內部表示可能隨時發生變化,您可能會得到不正確的結果,這是針對具體實現的,無法準確測量對象大小在Java中,據我所知

還要注意,可用RAM的上限總是取決於你的JVM的設置中,Oracle的JVM設置可以通過-Xmx改變,符合候選條件後綴包括mg,例如:-Xmx2g - 不要撥弄-Xms,因爲它可以嚴重減慢一切,如果不是產生怪異的崩潰,因爲你有效地規避了每個JVM優化

免費文件系統空間&可用RAM:

/* Total number of processors or cores available to the JVM */ 
    System.out.println("Available processors (cores): " + 
    Runtime.getRuntime().availableProcessors()); 

    /* Total amount of free memory available to the JVM */ 
    System.out.println("Free memory (bytes): " + 
    Runtime.getRuntime().freeMemory()); 

    /* This will return Long.MAX_VALUE if there is no preset limit */ 
    long maxMemory = Runtime.getRuntime().maxMemory(); 
    /* Maximum amount of memory the JVM will attempt to use */ 
    System.out.println("Maximum memory (bytes): " + 
    (maxMemory == Long.MAX_VALUE ? "no limit" : maxMemory)); 

    /* Total memory currently in use by the JVM */ 
    System.out.println("Total memory (bytes): " + 
    Runtime.getRuntime().totalMemory()); 

    /* Get a list of all filesystem roots on this system */ 
    File[] roots = File.listRoots(); 

    /* For each filesystem root, print some info */ 
    for (File root : roots) { 
    System.out.println("File system root: " + root.getAbsolutePath()); 
    System.out.println("Total space (bytes): " + root.getTotalSpace()); 
    System.out.println("Free space (bytes): " + root.getFreeSpace()); 
    System.out.println("Usable space (bytes): " + root.getUsableSpace()); 
    } 

對象大小近似:

import java.lang.instrument.Instrumentation; 

public class ObjectSizeFetcher { 
    private static Instrumentation instrumentation; 

    public static void premain(String args, Instrumentation inst) { 
     instrumentation = inst; 
    } 

    public static long getObjectSize(Object o) { 
     return instrumentation.getObjectSize(o); 
    } 
} 

public class C { 
    private int x; 
    private int y; 

    public static void main(String [] args) { 
     System.out.println(ObjectSizeFetcher.getObjectSize(new C())); 
    } 
} 
相關問題