java - 读取大文件到数组 java.lang.OutOfMemoryError : Java heap space

标签 java for-loop out-of-memory bufferedreader

我正在尝试将一个非常大的文件读取到一个数组中。很明显,我现在没有将它读入数组,但这不是我遇到的问题。 它大约有 6 亿位数字,这似乎导致它出错。 线程“main”中的异常 java.lang.OutOfMemoryError:Java 堆空间

BufferedReader brWorld = null;
String World;
brWorld = new BufferedReader(new FileReader("Saves/" + Name));
World = brWorld.readLine();
String Numbers = World;
String[] LoadWorld = Numbers.split("");
for(int x = 0; x < MaterialArray.length * MaterialArray.length; x++){
    System.out.println(String.valueOf(LoadWorld[x]));
}

我正在为我的游戏将一个 would 加载到一个数组中。 有没有办法加载这么大的文本文件? 谢谢利亚姆

最佳答案

首先,您将需要大量内存。几 GB 的 RAM,不包括 GC 空间。

如果你正在读取 600M 数字的“单行”,最后,在实际读取该行之后(你可能甚至没有读到这里),600M 数字的字符串将需要 1.2GB 的内存, 仅针对字符。

Java 将字符串存储为字符数组,而字符在内部存储为 UTF-16,即 2 个字节。

仅此一项就可以通过屋顶发送内存需求。

当您进行拆分时,您会将每个数字转换为一个单独的字符串。您现在拥有 600M Strings,以及随之而来的所有开销。至少,您要查看每个字符串至少 16 个字节,因为它存储了指向底层数组的指针、数组的偏移量以及字符串的长度。值得庆幸的是,split 实际上会重用底层数组,但这在这里真的没什么帮助。

16 字节 * 600M 为 9.6GB。

现在肯定会进入内存需求的“可笑”领域。

你没有说出你真正想做什么。你想“加载文件”,但你没有说什么。因此,很难就应该如何完成提供建议。如果你只想打印文件,那么你可以简单地一个一个地读取每个字符并打印出来,但这显然不是目标。

所以,虽然,是的,您可以在这个问题上“抛出内存”,但您不想这样做。您需要研究问题并更好地表示您要实现的目标并从那里开始工作。

关于java - 读取大文件到数组 java.lang.OutOfMemoryError : Java heap space,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23141598/

相关文章:

java - 如何检查 Scroll Lock 是打开还是关闭?

Python 101 和数学逻辑 - 列出小于 n 的平方根数

android - Glide和recyclerview,内存太大

使用标签名称从 Tumblr 获取所有帖子的 java 代码

java - 如何确定 2 种字体是否具有相同的字形?

java - 验证私有(private)帮助器方法的参数

ruby - 使 for X in Y 循环返回它包含的语句返回的任何内容

python - 使用来自另一个 pandas DF 的最小值的 id 填充 pandas 列

c++ - 双重释放或内存分配错误

java - 无法写入超出特定大小的 DataOutputStream - OutOfMemoryError