Java - 将大文件加载到内存中的替代方法

时间:2014-05-12 22:21:16

标签: java multithreading

我有一个程序可以将一个大文件加载到内存中,逐行加载到一个数组中。一行=数组中的一个索引。每行数据都需要“使用/处理”。然后我在主类中有一个静态AtomicInteger。我创建了多个工作线程,每个工作线程通过调用MainClass.array[MainClass.atomicint.getAndIncrement()]

获取所需的数据

这很有效,但是现在我开始使用更大的文件,我没有记忆错误等等。我怎么能这样做,这样我才能忘记记忆。

3 个答案:

答案 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();
    }
}