在java中将大文件加载到arraylist的最佳方法

我有一个大小约300mb的文件。 我想逐行读取内容,然后将其添加到ArrayList中。 所以我创建了一个数组列表a1的对象,然后使用BufferedReader读取文件,之后当我将文件中的行添加到ArrayList中时,它在线程“main”中给出错误exceptionjava.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(); } } 

天真地,通过Xmx命令行参数增加堆的大小(有关指导,请参阅此优秀答案 )

这只会达到一定程度,而是考虑构建数据,以便最大限度地减少内存需求。 你是否一次需要记忆中的所有东西? 也许你只需要测试一个项目是否在该集合中,考虑使用散列或布隆filter(等)。

只需增加Java的堆大小

java -Xmx250m

如果从IDE set -Xmx250m在参数中运行项目。

250米是250mb

如果必须将它放在内存中,可以尝试通过将-mx选项传递给java可执行文件来增加堆大小。

如果你真的需要同时在内存中的所有数据,也可能值得考虑这个问题。 可能是您可以按顺序处理它,也可以将大部分或全部保存在磁盘上。

传递-Xmx1024m以将堆sapce增加到1024 mb。

 java -Xms1024m -Xmx512m HelloWorld 

您可以在32位系统上增加最多4GB,在64位系统上可以增加更多。

使用java.nio.file.Files.readAllLines,它返回List. 如果你让OOME增加堆大小为java -Xmx1024m

我同意@Murali,这将解决你所面临的问题。 但建议在处理大文件时使用缓存。 如果文件大小在极少数情况下变为500Mb怎么办? 使用像Memcached这样的缓存API,这将消除JVM中的内存中断。

如果可以:批量处理10000行以上的文件。

读取10k行进程重复直到完成