【问题标题】:Median in 500GB file java500GB文件java中的中位数
【发布时间】:2018-08-02 08:15:59
【问题描述】:

在命令提示符处查找给定 500GB 文件中所有数字的中位数。

文件格式如:

12 
4
98
3

每行有一个数字(数字可以重复)。有人可以帮忙看看如何在 JAVA 中处理这个问题吗? 如果我们必须拆分文件,那么如何计算中位数? 我遇到过几篇关于中位数的帖子,但在这么大的文件上找不到最佳方法。

【问题讨论】:

  • @juzraai 我在发帖之前已经检查过这个链接,因为我找不到正确的答案
  • 嗯?那么正确答案是什么,或者您对正确答案的期望是什么?
  • Scala,我在那个问题/答案上找不到任何对 Scala 的引用?答案是关于如何做到的,即算法!
  • @Siri 这与 Scala 或 Java 无关。如果您不了解算法,那么语言就无关紧要。计算 BIG 数据集中的中位数可能很棘手(如前所述 - 你不需要均值/平均值吗?)如果你知道算法,那么你无法解决哪些具体问题?

标签: java algorithm median median-of-medians


【解决方案1】:

这不包括计算本身,但这里是你如何读取文件的小部分,这样你就不会耗尽内存。

try (
    InputStream fis = Files.newInputStream(Paths.get(fileName), StandardOpenOption.READ);
    BufferedReader book = new BufferedReader(new InputStreamReader(fis, StandardCharsets.UTF_8));
) {
    String line = null;
    long cnt = 0;
    while ((line = book.readLine()) != null) {
        cnt++;
        BigInteger data = new BigInteger(line);
        ... handle the data
        if (cnt % 500 == 0) System.gc(); // invoke garbage collector
    }
}

我最近需要导入一个 50mb 的文件,它给了我内存不足的错误,内存限制为 2GB,这只是因为它为每个对象保留了所有额外的元数据,而这种方法帮助我解决了这个问题。

【讨论】:

    【解决方案2】:

    500GB file with [not necessarily unique numbers represented as strings of decimal digits,] one number in each line
    - 最多 250_000_000_000L 个数字,每个数字不超过两倍,未指定符号的出现。

    假设您可以分配 1 GB 的 long 计数器,您可以计算任何给定长度低于 2500 万位的数字的数量,以及第一次传递的数字总数。
    确定数字字符串的(符号和)长度以表示您的中位数。
    在随后的遍历中,缩小中位数的范围,从相同(符号和)长度的数字表示开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-27
      • 2010-11-03
      • 2016-11-21
      • 2016-08-24
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      相关资源
      最近更新 更多