gpt4 book ai didi

java - 在Java中计算+2000万条记录的统计信息

转载 作者:行者123 更新时间:2023-11-29 06:50:45 25 4
gpt4 key购买 nike

我有 csv 文件 (600 MB) 和 2000 万行。我需要读取所有这些数据,从中创建 java 对象列表,并计算对象字段的一些指标,例如平均值、中位数、最大值、总和和其他统计数据。在 Java 中最好的方法是什么?我尝试了简单的 .forEach 循环,并花了一段时间(20 分钟)对其进行迭代。

更新:我使用 BufferReader 读取数据并将 csv 文件转换为某个 Java 类的对象列表。它非常快。 它在 forEach 循环中停留了 20 分钟,我在其中尝试迭代这 2000 万个对象列表并将它们分成 3 个列表,具体取决于当前对象中的值。所以基本上,我遍历整个列表一次,我有 if/else 条件,我检查对象中的某些字段是否等于“X”、“Y”或“Z”,并根据答案,分离这 2000 万条记录分为 3 个列表。

然后,对于这 3 个列表,我需要计算不同的统计数据:例如中位数、平均值、总和等

最佳答案

在广泛处理超过 600Mb 的数据量后,我可以提出两个声明:

  • 600Mb 不是大量数据,尤其是当我们谈论表格数据时;
  • 这些数量与大数据无关,实际上可以在内存中的传统硬件上轻松处理,这是最快的选择。

但是,您应该做的是确保将该数据读入列式连续数组,并使用直接对这些列式数据的连续数组进行操作的方法。

因为它是一个 csv 文件,按行存储,您最好将其整 block 读入字节数组并将其解析为按列预分配的表示形式。

将 600Mb 的 block 读入 SSD 的内存中应该只需要几秒钟,解析它将取决于您的算法(但必须能够立即在该结构中查找)。在内存方面,您将使用大约 600Mb 的三倍内存,但是对于 16Gb 的机器来说,这应该是一个明智的选择。

因此,不要急于使用 SQL 或切片文件,也不要将每个单元实例化为 Java 对象。也就是说,在这种异常(exception)情况中,您不需要Java 对象列表,您需要double[] 等。您可以使用ArrayList 如果您预先分配了精确的大小。其他标准集合会杀了你。

综上所述,我宁愿推荐 pythonnumpy 来完成任务,而不是 Java。 Java擅长对象,不如连续的内存块和相应的操作。 C++ 甚至 R 也可以。

关于java - 在Java中计算+2000万条记录的统计信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49119836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com