-3

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

文件格式例如:

12 
4
98
3

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

4

2 回答 2

0

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

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 内存限制的内存不足错误,这仅仅是因为它为每个对象保留了所有额外的元数据,而这种方法帮助我完成了它。

于 2018-08-02T09:17:36.313 回答
0

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 万位的数字的数量,以及第一遍中的数字总数。
确定数字字符串的(符号和)长度以表示您的中位数。
在随后的遍历中,缩小中位数的范围,从相同(符号和)长度的数字表示开始。

于 2018-08-02T14:31:44.303 回答