我需要读取一个包含几百万行的大文件。现在,当我读取整个文件时,缓冲区变得非常沉重,有时会抛出内存异常。
所以我想要的是,例如我有10000行。我想读到1000行,处理它然后再从1001读到2000年,依此类推,直到结束。任何帮助将受到高度赞赏。
我现在做了什么
String filePath="some path";
log.debug("File name got for promo :::::: "+filePath);
File f = new File(filePath);
int i = 0;
try {
System.out.println("Reading the file for data:::::: ");
BufferedReader br = new BufferedReader(new FileReader(f));
String aLine = null;
Runtime.getRuntime().freeMemory();
while ((aLine = br.readLine()) != null) {
System.out.println(aLine);
if(aLine.trim().length()!=12)
{
System.out.println("Not a Valid number at line --->"+(i+1));
continue;
}
//numberList.add(aLine.trim());
i++;
}
Runtime.getRuntime().freeMemory();
log.debug("Total Number/Row found in the file is --> " + i);
}
答案 0 :(得分:0)
不要将所有行存储在List
或任何其他结构中,只需将它们即时处理。
例如在你的情况下:
int nRows = 0;
int numbers = 0;
while ((aLine = br.readLine()) != null) {
if(aLine.trim().length() == 12) {
numbers++;
}
nRows++;
}
log.debug("Total number of rows: " + nRows);
log.debug("Total number of line of length 12: " + numbers);
答案 1 :(得分:0)
而不是使用固定缓冲区方法您可以考虑使用内存映射文件,通过FileChannels并可以使用java.nio包 - 这些应该比java.io更快,
这是链接到既有方法说明,固定缓冲区方法的文章 内存映射文件与nio: