JAVA - 尝试生成 1 到 10000000000 之间的每个数字并放入 txt 文件中,我得到了 GC 开销限制



我理解这个问题,但不确定如何解决。

public static List<String> getNumbersInRange(long start, long end) {

for (long i = start; i < end; i++) {
String padded = String.format("%012d", i);
result.add(padded);
}

return result;
}

上面是数字生成器,下面是文件生成器。我怎样才能做到这一点,这样我就不会出现内存泄漏?

long value = 1L;
long value1 = 100000000001L;

getNumbersInRange(value,value1);

BufferedWriter writer = new BufferedWriter(new FileWriter("UPC.txt"));

for(String str: result) {
writer.write(str + System.lineSeparator());
}
writer.close();

请原谅我,如果这没有经过深思熟虑,我已经有一段时间没有做任何编程了。

  1. 您将无法在列表中保留100_000_0000_000个长数字,因为Java中任何集合/数组的大小都是整数,因此它不能包含超过Integer.MAX_VALUE的项。

  2. 为了将上述范围打印到文件中,它将使用普通数字格式的1,088,888,888,890数字加上100,000,000,000分隔符来分隔数字,因此它将占用1,107GB的磁盘空间。假设你的硬盘能够以100MB/s的速度写入,那么写这个文件需要3个多小时。

不应该有一个返回要打印的字符串列表的函数,而应该编写一个在生成字符串时将字符串打印到文件中的函数。这样你就不必在内存中存储一个巨大的列表。

你可以试试这样的东西:

long value = 1L;
long value1 = 100000000001L;
LongStream.rangeClosed(value, value1)
.forEach(val -> {
try (BufferedWriter writer = new BufferedWriter(new FileWriter("UPC.txt", true));){
writer.write(String.format("%012d", val) + System.lineSeparator());
} catch (IOException e) {
e.printStackTrace();
}
});

这样,

  1. 您不在内存中保存数据
  2. 数据是为您自动生成的
  3. FileWriter构造函数应将第二个参数设置为true,以指示要附加到文件

最新更新