我的引擎正在執行1,000,000次模擬X
交易。在每次模擬過程中,對於每筆交易,都可以驗證特定條件。在這種情況下,我將該值(它是一個double
)存儲到一個數組中。每筆交易都會有自己的價值清單(即這些價值從一筆交易到另一筆交易都是相互依存的)。如何在計算過程中存儲數百萬的Double?
在所有模擬結束時,對於每筆交易,我在他的List<Double>
上運行算法以獲得一些輸出。不幸的是,該算法需要這些值的完整列表,因此,我無法修改我的算法來「即時」計算輸出,即在模擬期間。
在「正常」條件下(即X
較低,條件驗證時間少於10%),即使可以增強計算,計算也會正確結束。
當我有很多交易時(例如X = 30
),我的問題發生,幾乎所有的模擬驗證我的具體情況(比如說模擬的90%)。所以只是爲了存儲這些值,我需要約900,000 * 30 * 64bits
的內存(約216Mb)。我未來的要求之一是能夠運行5,000,000次模擬...
因此,我無法繼續使用當前存儲值的方式。目前,我使用了一個「簡單」的結構Map<String, List<Double>>
,其中關鍵是元素的ID和List<Double>
值的列表。
所以我的問題是如何增強我的應用程序的這一特定部分,以減少模擬期間的內存使用量?
也是另一個重要的一點是,對於最後的計算,我的List<Double>
(或其他結構,我將使用)必須訂購。所以如果我以前的問題的解決方案也提供了一個訂購新插入元素的結構(例如SortedMap
),那將非常棒!
我正在使用Java 1.6。
編輯1
我的引擎正在執行一些財務計算的確,在我的情況下,所有的交易都有關。這意味着我不能運行我的第一筆交易的計算,獲得輸出,清理List<Double>
,然後移動到第二筆交易,依此類推。
當然,作爲一個臨時解決方案,我們將增加分配到發動機的內存,但它不是我期待的解決方案;)
編輯2
關於算法本身。我不能在這裏給出確切的算法,但這裏有一些提示:
我們必須在排序的List<Double>
上工作。然後我將計算一個索引(它是根據給定的參數和List
本身的大小計算的)。然後,我最終返回此列表的index-th
值。
public static double algo(double input, List<Double> sortedList) {
if (someSpecificCases) {
return 0;
}
// Calculate the index value, using input and also size of the sortedList...
double index = ...;
// Specific case where I return the first item of my list.
if (index == 1) {
return sortedList.get(0);
}
// Specific case where I return the last item of my list.
if (index == sortedList.size()) {
return sortedList.get(sortedList.size() - 1);
}
// Here, I need the index-th value of my list...
double val = sortedList.get((int) index);
double finalValue = someBasicCalculations(val);
return finalValue;
}
我希望這將有助於有現在這樣的信息...
編輯3
目前,我不會考慮任何硬件修改(太漫長而複雜在這裏:()。增加了內存的解決方案將完成,但它只是一個權宜之計。
我在想一個解決方案的那使用臨時文件:在某個閾值(例如100,000)之前,我的List<Double>
將新值存儲在內存中。當List<Double>
的大小達到此閾值時,我在臨時文件中追加此列表(每筆交易一個文件)。
類似的東西:
public void addNewValue(double v) {
if (list.size() == 100000) {
appendListInFile();
list.clear();
}
list.add(v);
}
在整個計算結束時,每筆交易,我將重建從我有記憶,並在臨時文件的完整List<Double>
。然後,我運行我的算法。我清理這筆交易的價值,並轉向第二筆交易(我現在可以這樣做,因爲現在所有的模擬都已完成)。
您對這樣的解決方案有什麼看法?你認爲這是可以接受的嗎?
當然,我會失去一些時間來閱讀和在外部文件中寫我的價值觀,但我認爲這是可以接受的,不是嗎?
僅供參考:引擎是**不連接到任何數據庫。 – romaintaz 2010-10-14 15:15:14
你說當X很小時,計算正確結束。當你增加X並且計算不能正確結束時?你有任何輸出錯誤? – Mark 2010-10-14 15:21:39
當強力失敗時,多想一想。我看起來像你可能使用蒙特卡羅模擬方法,並且有關這個主題的大量文獻。 – msw 2010-10-14 15:33:08