簡體   English   中英

在Java中同時迭代兩個非常大的文件

[英]Iterating in two extremely large files simultaneously in Java

我需要通過從第一個寫入4行到輸出文件中,而不是從第二個寫入4行來合並兩個非常大的文件(每個> 1G)。 以此類推,直到最后。 兩個文件的行數相同,並且該數可被四整除。 在Java中最有效的方法是什么?

我喜歡使用Decorator模式。 創建兩個類,每個類代表一個BufferedReader實例。

例如,

class First
{
   BufferedReader br;
   ...
   public String getLine()
    {
       return br.readLine();
     }
}

class Second
{
  BufferedReader br;
  ...
  public String [] getLines()
   {
     //read four lines and return it
   }
}

試試看,看看需要多長時間。 相應地調整n。 如果太慢,請嘗試使用nio。

import java.io.*;
class Time {
    Time() {}
    long dt() {
        return System.currentTimeMillis() - t0;
    }
    final long t0 = System.currentTimeMillis();
}
public class Main {
    public static void create(File file1, File file2, int n) throws Exception {
        BufferedWriter bw1 = new BufferedWriter(new FileWriter(file1));
        write(bw1, n, "foo");
        bw1.close();
        BufferedWriter bw2 = new BufferedWriter(new FileWriter(file2));
        write(bw2, n, "bar");
        bw2.close();
    }
    private static void write(BufferedWriter bw, int n, String line) throws IOException {
        for (int i = 0; i < n; i++) {
            bw.write(line);
            bw.write(lineSeparator);
        }
    }
    private static void write4(BufferedReader br1, BufferedWriter bw, String line) throws IOException {
        bw.write(line);
        bw.write(lineSeparator);
        for (int i = 0; i < 3; i++) {
            line = br1.readLine();
            bw.write(line);
            bw.write(lineSeparator);
        }
    }
    public static void main(String[] args) throws Exception {
        File file1 = new File("file1");
        File file2 = new File("file2");
        if (!file1.exists()) {
            create(file1, file2, 10000000);
        }
        File file3 = new File("file3");
        Time time=new Time();
        BufferedReader br1 = new BufferedReader(new FileReader(file1));
        BufferedReader br2 = new BufferedReader(new FileReader(file2));
        BufferedWriter bw = new BufferedWriter(new FileWriter(file3));
        String line1, line2;
        while ((line1 = br1.readLine()) != null) {
            write4(br1, bw, line1);
            line2 = br2.readLine();
            write4(br2, bw, line2);
        }
        br1.close();
        br2.close();
        bw.close();
        System.out.println(time.dt()/1000.+" s.");
    }
    static final String lineSeparator = System.getProperty("line.separator");
}

抱歉,如果這個想法已經給出:)

我認為最快的方法是創建3個線程。 t1和t2將從兩個輸入文件中讀取,每個線程將具有其自己的隊列(這是線程安全的),並且該線程將讀取4行並將其放入其隊列中。 t3將是寫入線程,它將可互換地從兩個隊列中讀取節點,並將其放入新的合並文件中。 我認為這是一個很好的解決方案,因為它允許對所有三個文件進行並行i \\ o(並且這里i \\ o是瓶頸)。並且線程之間的交互最少。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM