[英]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.