我创建模型来模拟复杂系统。当“代理”在系统中流动时,我会跟踪各种特征。目前,我的方法是使用多维数组。例如,我每年每个月都会报告我的代理的当前状态。我还需要跟踪这些代理的属性。所以,我使用多维数组,如下:
int[][][][][] reporting = new int[NUM_YEARS][12][NUM_POSSIBLE_SIZES][NUM_POSSIBLE_EXPERIENCES][MAX_AGE];
for (Agent a : agents){
reporting[currentYear][currentMonth][a.size][a.experience][a.age] ++;
//Size, experience, and age are integers
}
在模拟结束时,我将所有值输出到外部文件。
我的问题是这样的:
这些数组具有高度的多维性(例如,我添加了宽度、numOwners、价格、重量、高度等)。我喜欢它提供的特殊性,但是因为 Java 在我创建报告结构时会初始化所有这些整数。
在上一篇文章中,我了解到最好在数组的前面创建具有较小范围的段,例如:
int[][] reporting = new int[2][20];
好于
int[][] reporting = new int[20][2];
但是,即使进行了这种优化,我有时也会用完堆空间。我发现我通常只使用可用插槽的 1-2%!关于节省空间但为我的报告保持相同细分深度的任何提示?
我考虑过让我的写入缓冲区保持打开状态,但这似乎并不明智;我通常有五个左右的这些多维报告结构,所以我必须保持五个 BufferedWriters 处于打开状态。
谢谢!