我有一个包含1亿条记录的文本文件。我使用非常古老的方式来读取文件,但由于内存不足问题需要很长时间而无法完成。如果你能推荐使用java或使用任何外部库来读取文件的最佳和最佳方式,我真的很感激。(终极解决方案应该减少耗时)这是我的代码,如上所述,
BufferedReader reader = null;
List<String> fileLines = new ArrayList<String>();
String line = "";
reader = new BufferedReader(new java.io.FileReader(file));
while ((line = reader.readLine()) != null) {
fileLines.add(line);
}
reader.close();
return fileLines;
也用另一种方式但结果相同。
public static void fileReading(File file, Object executingClass, String methodName, int size) throws IOException {
try {
Method method = executingClass.getClass().getMethod(methodName, List.class);
BufferedReader reader = null;
List<String> fileLines = new ArrayList<String>();
String line = "";
reader = new BufferedReader(new java.io.FileReader(file));
int track = 0;
while ((line = reader.readLine()) != null) {
track++;
fileLines.add(line);
if (0 == track % size) {
method.invoke(executingClass, fileLines);
fileLines.clear();
}
}
if (!fileLines.isEmpty()) {
method.invoke(executingClass, fileLines);
fileLines.clear();
}
reader.close();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
答案 0 :(得分:1)
您有两种选择:
1 - 最好不要读取整个文件并将其存储在内存中。只需读取一行(或表示条目的一组行),处理它,然后对文件中的所有行重复它。
2 - 如果你真的需要将整个文件存储在内存中,请尝试增加JVM堆的大小。
答案 1 :(得分:-1)
尝试通过传递以下参数来扩大分配给JVM的内存:
-Xms=3000m -Xmx=5000m
m
表示MiB。您也可以将g
用于GiB。