繁体   English   中英

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

[英]Working with large amounts of data in java: speed

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

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

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

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

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

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

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

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

数学速度

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

记忆足迹

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

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

    private long[] valueBlah;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM