中值500GB档案Java

时间:2018-08-02 08:15:59

标签: java algorithm median median-of-medians

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

文件格式,例如:

12 
4
98
3

每行有一个数字(数字可以重复)。有人可以帮忙在JAVA中解决这个问题吗? 如果我们必须分割文件,然后如何计算中位数? 我碰到过几条有关中位数的帖子,但找不到如此大文件的最佳方法。

2 个答案:

答案 0 :(得分: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,这仅仅是因为它为每个对象保留了所有额外的元数据,并且这种方法帮助我解决了这个问题。 / p>

答案 1 :(得分: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万个数字的数字的数量,以及第一次通过时的总数。
确定数字字符串的(符号和)长度以代表您的中位数。
在随后的遍中,从具有相同(符号和)长度的数字表示开始,缩小中位数的范围。