【问题标题】:Working with large amounts of data in java: speed在 java 中处理大量数据:速度
【发布时间】:2011-01-25 13:32:42
【问题描述】:

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

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

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

这是可行的吗?这种方法会很快吗?

【问题讨论】:

    标签: java algorithm performance


    【解决方案1】:

    将元组加载到浮点数的二维数组而不是类实例的一维数组中可能会更快,因为您似乎希望在各个元组之间进行大量比较(因此您会以 1d 数组方式访问类属性 100k 次 + 每个查询)

    【讨论】:

      【解决方案2】:

      如果您想逐列快速扫描,我建议您单独存储每一列。例如扫描 float[] 比相同数量的包含 float 的对象要快得多。 (您的缓存会更喜欢它作为开始)

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          数学速度

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

          内存占用

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

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

          【讨论】:

          • 这与其他答案中所说的相反,不是吗?
          • 如果与“例如扫描 float[] 的速度要快得多”相反,您的意思是“根本不是相反的”,那么我同意。是的。
          猜你喜欢
          • 2011-09-30
          • 2013-01-10
          • 2011-01-10
          • 2011-11-24
          • 1970-01-01
          • 2015-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多