在java中使用大量数据:速度

时间:2011-01-25 13:32:42

标签: java algorithm performance

我希望以16元组(x_1,...,x_16)的形式使用10k-100k数据点。元组的大多数元素都是[0,1]中的浮点数,还有一个字符串和一些整数。

我希望能够对选定的数据点进行快速(最好<10ms)的数学运算。例如:计算满足的所有点的x_15的平均值:x_3在[0.3,0.4]中并且x_5> X_2。

我天真的做法是为每个元组创建一个类,然后对类进行数学运算。对于存储,我只需在程序完成时将所有元组写入文本文件,并在程序启动时从那里加载它们。

这是否可行,这种方法会快速闪电吗?

4 个答案:

答案 0 :(得分:2)

将元组加载到2维浮点数组而不是1维数组类实例中可能会更快,因为看起来你会想要在单个元组之间做很多比较(所以你会有访问类属性100k次+每个查询以1d数组方式执行)

答案 1 :(得分:2)

如果您希望按列进行快速扫描,建议您单独存储每个列。例如扫描浮点数[]比包含浮点数的相同数量的对象快得多。 (你的缓存更喜欢它的开始)

另一种方法是使用索引数据,但您需要确定这对您来说是否更快。

答案 2 :(得分:0)

最好使用重度索引的数据库作为开始。然后,您可以在数据库查询中做很多事情,这样您实际需要处理的唯一数据就是符合条件的数据。否则速度将归结为文件数据的排序顺序,以及您可以投入多少CPU和内存。我怀疑I / O和过滤数据可能是最重要的杀手。

答案 3 :(得分:0)

数学速度

如果浮点值是实际定点值,我相信通过将它们存储为整数(或长整数)并使用int算术运算来操纵它们,可以提高速度。例如,您可以将值0.000001表示为1,将值0.123456表示为123456。

内存占用

至少在另一个答案中提到,当你加载你的值时,将它们存储在一个值数组中将比一个tupple对象数组具有更小的内存占用(这样每个tupple至少少1个引用)。例如:

public class MathTupple
{
    public MathTupple(int tuppleCount)
    {
        valueBlah = new long[tuppleCount];
    }

    private long[] valueBlah;
}