Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:高度分段的数据(多维数组)。如何节约空间?_Java_Arrays_Heap Memory - Fatal编程技术网

Java:高度分段的数据(多维数组)。如何节约空间?

Java:高度分段的数据(多维数组)。如何节约空间?,java,arrays,heap-memory,Java,Arrays,Heap Memory,我创建复杂系统的模型。当“代理”流经系统中的状态时,我会跟踪各种特性。目前,我的方法是使用多维数组。例如,我每年每个月都会报告代理的当前状态。我还需要跟踪这些代理的财产。因此,我使用多维数组,如下所示: int[][][][][] reporting = new int[NUM_YEARS][12][NUM_POSSIBLE_SIZES][NUM_POSSIBLE_EXPERIENCES][MAX_AGE]; for (Agent a : agents){ reporting[cur

我创建复杂系统的模型。当“代理”流经系统中的状态时,我会跟踪各种特性。目前,我的方法是使用多维数组。例如,我每年每个月都会报告代理的当前状态。我还需要跟踪这些代理的财产。因此,我使用多维数组,如下所示:

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
}
在模拟结束时,我将所有值输出到一个外部文件

我的问题是:

这些阵列具有高度多维性(例如,我添加了宽度、割草机、价格、重量、高度等)。我喜欢它提供的特殊性,但因为Java在创建报告结构时初始化了所有这些int

在上一篇文章中,我了解到最好在数组的前面生成范围较小的段,例如:

int[][] reporting = new int[2][20];

int[][] reporting = new int[20][2];
然而,即使进行了这种优化,我有时也会耗尽堆空间。我发现我通常只使用1-2%的可用插槽!在我的报告中有没有关于节省空间但保持相同分段深度的提示

我曾考虑过保持我的写作缓冲区开放,但这似乎并不明智;我通常有五个左右的多维报告结构,所以我必须保持五个BufferedWriter打开


谢谢

这里概括介绍了一种可能的解决方案。这个解决方案假定只有极少数可能的维度被实现,并且绝大多数是不可能的或没有意义的

  • 使用流行的、免费提供的JavaRDBMS创建内存中的表

  • 表的主键应该是包含构成数组索引的所有条件的复合键

  • 处理代理时,在表中搜索具有所有条件的记录

  • 如果找到记录,请修改其数据

  • 如果未找到任何记录,请在表中输入新记录,并将新条件作为主键

  • 处理完所有代理后,您的数据分析在内存中有了一个合理紧凑、索引、可搜索的表示形式

这种解决方案有一定的优势。如果相对于可用内存,可能的维度数量仍然很大,则可以使表基于磁盘。这使您能够获得非常大的数据集,否则,内存缓存数据结构将无法以性能为代价获得这些数据集。另一个优点是,由于表由RDBMS引擎维护,因此可以使用非常强大的查询系统对其进行搜索。基本上,你可以免费获得额外的多功能性

此解决方案的主要缺点是需要JDBC或某些实体映射框架,因此可能需要学习新的API。另一个缺点是,虽然内存表相对较快,但这种解决方案仍然比依赖于内存中原始数据结构的解决方案慢


有几个RDBMS选项。我是目前版本为2.3.0的HSQLDB()的粉丝。它支持缓存表和内存表,成熟,内存占用小,可以在独立模式下使用(从而使其几乎不需要管理)。其他免费提供的RDBMS enjines for Java包括Apache的Derby和SQLite,它们可以在Java中与单独可用的JDBC驱动程序一起使用。还可以使用任意数量的库,无论是开源库还是商业库,它们为JDBC数据集(如Jaspersoft的iReport)提供复杂、可定制和健壮的报告。

这也是生物系统中的一个问题,在生物系统中,分析需要能够针对多个可能维度进行抽象的数据(如“多维超立方体”)。解决方案可能涉及整合您的数据结构,以便在内存中只具体化可能的或有意义的维度。数组可能不是表示此类解决方案的最佳方式。使用更复杂的数据结构可能是答案的一部分。很难更具体,因为目前只有您了解您试图解决的问题的详细信息。请检查。看起来您不需要使用数组