在命令提示符下查找给定500GB文件中所有数字的中值。
文件格式,例如:
12
4
98
3
每行有一个数字(数字可以重复(。有人能帮忙用JAVA处理这个问题吗?如果我们必须拆分文件,那么如何计算中位数?我在中位数上看到过几篇帖子,但在这么大的文件上找不到最好的方法。
这不包括计算本身,但以下是如何将文件分成小部分读取,这样就不会耗尽内存。
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内存限制的内存不足错误,只是因为它为每个对象保留了所有额外的元数据,这种方法帮助我度过了难关
500GB file with [not necessarily unique numbers represented as strings of decimal digits,] one number in each line
-最多为250_000_0000L个数字,每个数字的位数不超过两倍,未指定符号的出现次数。
假设您可以分配1GB的long
计数器,则可以计算任何给定长度低于2500万位的数字的数量,以及第一次通过的数字总数。
确定数字字符串的(符号和(长度以表示您的中值
在随后的过程中,缩小中位数的范围,从相同(符号和(长度的数字表示开始。