我有一个大小约为300mb的文件。我想逐行读取内容,然后将其添加到ArrayList中。所以我创建了一个数组列表a1的对象,然后使用BufferedReader读取文件,之后当我将文件中的行添加到ArrayList时,它会在线程“main”中给出错误异常java.lang.OutOfMemoryError:Java堆空间。
请告诉我这应该是什么解决方案。
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
FileReader file = new FileReader(
"/home/dmdd/Desktop/AsiaData/RawData/AllupperairVcomponent.txt");
ArrayList a1 = new ArrayList();
BufferedReader br = new BufferedReader(file);
String line = "";
while ((line = br.readLine()) != null) {
a1.add(line);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
答案 0 :(得分:4)
天真地,通过Xmx命令行参数增加堆的大小(有关指导,请参阅此excellent answer)
这只能达到一定程度,而是考虑构建数据,以便最大限度地减少内存需求。你是否一次需要记忆中的所有东西?也许你只需要测试一个项目是否在该集合中,考虑使用散列或布隆过滤器(等)。
答案 1 :(得分:4)
只需增加Java的堆大小
java -Xmx250m
如果您从IDE set -Xmx250m在参数中运行项目。
250m是250mb
答案 2 :(得分:2)
如果您将包含在内存中,则可以尝试通过将-mx
选项传递给java
可执行文件来增加堆大小。
如果您确实需要同时在内存中存储所有数据,那么也可能值得考虑这个问题。可能是您可以按顺序处理它,也可以将大部分或全部保存在磁盘上。
答案 3 :(得分:1)
传递-Xmx1024m以将堆空间增加到1024 mb。
java -Xms1024m -Xmx512m HelloWorld
在32位系统上可以增加4GB,在64位系统上可以增加更多。
答案 4 :(得分:0)
使用java.nio.file.Files.readAllLines,它返回List<String>.
如果你让OOME增加堆大小为java -Xmx1024m
答案 5 :(得分:0)
我同意@Murali的一部分,这将解决你所面临的问题。但是建议在处理大文件时使用缓存。如果文件大小在极少数情况下变为500Mb怎么办?使用像Memcached这样的缓存API,这将消除JVM中的内存中断。
答案 6 :(得分:0)
如果可以:批量处理10000行以上的文件。
读取10k行 处理 重复直到完成