【发布时间】:2020-02-26 15:11:44
【问题描述】:
我正在尝试读取一个非常大的文件 (~2GB)。内容是带有句子的连续字符串(我想根据“。”来拆分它们)。无论我如何尝试,最终都会出现 Outofmemory 错误。
BufferedReader in = new BufferedReader(new FileReader("a.txt"));
String read = null;
int i = 0;
while((read = in.readLine())!=null) {
String[] splitted = read.split("\\.");
for (String part: splitted) {
i+=1;
users.add(new User(i,part));
repository.saveAll(users);
}
}
还有,
inputStream = new FileInputStream(path);
sc = new Scanner(inputStream, "UTF-8");
while (sc.hasNextLine()) {
String line = sc.nextLine();
// System.out.println(line);
}
// note that Scanner suppresses exceptions
if (sc.ioException() != null) {
throw sc.ioException();
}
文件内容(由随机单词组成,10个单词后加一个句号):
fmfbqi .xcdqnjqln kvjhw pexrbunnr cgvrqlr fpaczdegnb puqzjdbp gcfxne jawml aaiwwmo ugzoxn .opjc fmfbqi .xcdqnjqln kvjhw pexrbunnr cgvrqlr fpaczdegnb puqzjdbp gcfxne jawml aaiwwmo ugzoxn .opjc (so on)
请帮忙!
【问题讨论】:
-
赤裸裸的事实是:如果文件对您的记忆来说太大,并且您尝试一次全部读取,那么无论如何它都会失败。您是否出于某种原因实际上需要一次将所有内容存储在内存中?或者你可以逐块处理它(在你想要的任何垃圾中,也许是线条,也许在每个句号之后被切断,无论如何......)。因为如果可能的话,后者在资源需求上总是更容易。
-
你试过
java.nio.file.Files.lines()吗?将其流式传输...但是,如果您将拆分值存储在内存中的某个位置,则无论您如何读取文件,都可能会出现内存不足。 -
如果该行中没有偶尔的换行符(即都是一行),那么
Files.lines()将遇到基本相同的问题,您需要逐块处理以其他方式分块。 -
然后使用数据库或将其部分存储在文件中...
-
如果没有换行符,则只有一行,因此只有一个行号。
标签: java filestream bufferedinputstream