我有一个程序可以将一个大文件加载到内存中,逐行加载到一个数组中。一行=数组中的一个索引。每行数据都需要“使用/处理”。然后我在主类中有一个静态AtomicInteger。我创建了多个工作线程,每个工作线程通过调用MainClass.array[MainClass.atomicint.getAndIncrement()]
这很有效,但是现在我开始使用更大的文件,我没有记忆错误等等。我怎么能这样做,这样我才能忘记记忆。
答案 0 :(得分:3)
你可以让一个线程向ArrayBlockingQueue添加行。它可以检查队列永远不会太大以避免OOME。您还可以拥有一个读取此队列的线程池来完成下一个任务。
答案 1 :(得分:0)
不要将整个文件加载到内存中。根据需要逐行加载。
有一个类来读取文件的行。不是所有的行,而是一次一行。 然后让你的线程调用这个类,请求换行。当类返回null时,因为没有更多的行要处理。
答案 2 :(得分:0)
通常,将整个文件加载到内存中是不好的做法,因为您的内存要求可能是任意大的 - 特别是当文件由用户提供时。你想要的是阅读它并以块的形式处理它,例如:
try (BufferedReader br = new BufferedReader(new FileReader("somefile"))) {
String line = br.readLine();
while (line != null) {
process(line);
line = br.readLine();
}
}