Java - 存储混合类型(数组,内部表)

时间:2015-09-03 09:58:21

标签: java

这是我的第一篇文章,我保证我会在这个问题上搜索一下。在任何想象中我都不是Java,所以我可能只是不明白我想要实现的目标。

我来自旧的IBM / AS400 + ABAP以及偶尔的Delphi编程背景。

我需要实现的是内部存储大约1,000,000到10,000,000行,大约50列。我需要对这些值执行一大堆数学方程式,因此访问数据库不是一种选择。

50列中的大多数将是整数或指示符值,但主键将是日期值(并非Java似乎可以做日期:))。

因此,从我早期的编程日来看,术语“数组”(IBM)和内部表(SAP ABAP)就是我习惯的。

但是对于通过Eclipse的Java,我看到了很多我真的不熟悉的东西。 ArrayList,Treemaps,Objects,我玩过其中的一些,但我可能不会做得对。

因此,大师,在这种情况下使用的最佳机制是什么。考虑到它需要表现良好的音量。

非常感谢提前

Panduranga

2 个答案:

答案 0 :(得分:0)

我认为您应该重新考虑使用某种数据库,除非您的目标系统提供大量RAM并选择不同的主键(或者在1970-01-01之后使用millis中的日期)。

对于您给出的示例,我将为每列使用64位内存:

64位* 50 * 10,000,000 = 32000000000位 ~3,72 GiB

然后从一个简单的类开始,以保​​存这50列:

public class MyEntity {
    public long index;
    public long value;
    ...
}

要存储它们,您可以使用Map(仅在必要时使用Date作为索引):

Map<Date, MyEntity> mapEntities = new HashMap<Date, MyEntity>();

如果您决定将所有对象存储在RAM中,则必须调整Java-VM的内存(对于您的情况,大约为4g):

java -Xmx4g

答案 1 :(得分:0)

  1. 确定您需要的索引方法。根据什么标准,您要从该表中选择特定行?它们是顺序的(只是逐行处理)?您是否需要按行标准在行之间随机跳转(例如,取决于某些公式的中间结果)?
  2. 鉴于第一个问题的答案,您可以决定哪种数据结构最适合您。一些例子:

    • 有子行和父行吗?某种图形或树可能是最好的。
    • 查询标准很复杂,可能会有变化吗?考虑使用支持SQL的数据库。
    • 您需要经常根据几列的值或其衍生计算选择值吗?考虑索引到某种Map。甚至可能多次构建不同的索引。
    • 您需要浏览所有行并为每个行进行一些计算?任何类型的列表都可以。