Rom*_*las 6 java performance data-structures
我的引擎正在执行1,000,000次X交易模拟.在每次模拟期间,对于每笔交易,可以验证特定条件.在这种情况下,我将值(即a 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>(或我将要使用的任何结构).因此,如果前一个问题的解决方案也提供了一个订购新插入元素的结构(例如a ),那将非常棒!SortedMap
我使用的是Java 1.6.
编辑1
我的引擎确实正在执行一些财务计算,在我的情况下,所有交易都是相关的.这意味着我无法在第一笔交易中运行计算,获得输出,清理List<Double>,然后转移到第二笔交易,依此类推.
当然,作为临时解决方案,我们将增加分配给引擎的内存,但这不是我期望的解决方案;)
编辑2
关于算法本身.我不能在这里给出确切的算法,但这里有一些提示:
我们必须在分类上工作List<Double>.然后我将计算一个索引(根据给定的参数和List自身的大小计算).然后,我最终返回index-th此List 的值.
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;
}
Run Code Online (Sandbox Code Playgroud)
我希望现在有这些信息会有所帮助......
编辑3
目前,我不会考虑任何硬件修改(这里太长而复杂:().增加内存的解决方案将完成,但它只是一个快速修复.
我在想一个使用临时文件的解决方案:在某个阈值(例如100,000)之前,我List<Double>将新值存储在内存中.当大小List<Double>达到此阈值时,我将此列表附加到临时文件中(每个交易一个文件).
像这样的东西:
public void addNewValue(double v) {
if (list.size() == 100000) {
appendListInFile();
list.clear();
}
list.add(v);
}
Run Code Online (Sandbox Code Playgroud)
在整个计算结束时,对于每笔交易,我将从List<Double>内存和临时文件中重建完整内容.然后,我运行我的算法.我清理了这笔交易的价值,并转到第二笔交易(我现在可以这样做,因为现在所有的模拟都已完成).
你怎么看待这样的解决方案?你认为这是可以接受的吗?
当然,我会浪费一些时间在外部文件中读取和写入我的值,但我认为这是可以接受的,不是吗?
您可以使用浮点数而不是双精度数吗?这将为您节省 100Mb。