1

それぞれが同一の構造を持つ 2 つの大きなデータ ファイルの違いを分析する必要があります。各ファイルのサイズは数ギガバイトで、おそらく 3,000 万行またはテキスト データがあります。データ ファイルは非常に大きいので、行を順番に繰り返し処理する方が簡単な場合でも、それぞれを独自の配列にロードすることを躊躇します。各行の構造は次のとおりです。

topicIdx, recordIdx, other fields...  

topicIdx と recordIdx はシーケンシャルで、ゼロから始まり、反復ごとに +1 ずつ増加するため、ファイル内で簡単に見つけることができます。(検索する必要はありません。順番に前にインクリメントするだけです)。

私は次のようなことをする必要があります:

for each line in fileA  
    store line in String itemsA  
       get topicIdx and recordIdx  
           find line in fileB with same topicIdx and recordIdx  
               if exists  
                   store this line in string itemsB  
                       for each item in itemsA  
                           compare value with same index in itemsB  
                               if these two items are not virtually equal  
                                   //do something  
                else  
                    //do something else  

FileReader と BufferedReader を使用して次のコードを書きましたが、これらの API は必要な機能を提供していないようです。以下のコードを修正して、私が望むことを達成する方法を誰かに教えてもらえますか?

void checkData(){  
    FileReader FileReaderA;  
    FileReader FileReaderB;  
    int topicIdx = 0;  
    int recordIdx = 0;  
    try {  
        int numLines = 0;
        FileReaderA = new FileReader("B:\\mypath\\fileA.txt");  
        FileReaderB = new FileReader("B:\\mypath\\fileB.txt");  
        BufferedReader readerA = new BufferedReader(FileReaderA);  
        BufferedReader readerB = new BufferedReader(FileReaderB);
        String lineA = null;
        while ((lineA = readerA.readLine()) != null) {
            if (lineA != null && !lineA.isEmpty()) {
                List<String> itemsA = Arrays.asList(lineA.split("\\s*,\\s*"));
                topicIdx = Integer.parseInt(itemsA.get(0));
                recordIdx = Integer.parseInt(itemsA.get(1));
                String lineB = null;
                //lineB = readerB.readLine();//i know this syntax is wrong
                setB = rows from FileReaderB where itemsB.get(0).equals(itemsA.get(0));
                for each lineB in setB{
                    List<String> itemsB = Arrays.asList(lineB.split("\\s*,\\s*"));
                    for(int m = 0;m<itemsB.size();m++){}
                    for(int j=0;j<itemsA.size();j++){  
                    double myDblA = Double.parseDouble(itemsA.get(j));  
                    double myDblB = Double.parseDouble(itemsB.get(j));  
                    if(Math.abs(myDblA-myDblB)>0.0001){  
                        //do something  
                    }  
                 }  
            }  
        }  
        readerA.close();  
    }   catch (IOException e) {e.printStackTrace();}  
}  
4

3 に答える 3

2

検索キー (recordIdx と topicIdx) で並べ替えられた両方のファイルが必要なので、このようなマージ操作を行うことができます。

open file 1
open file 2
read lineA from file1
read lineB from file2
while (there is lineA and lineB) 
    if (key lineB < key lineA) 
        read lineB from file 2
        continue loop
    if (key lineB > key lineA)
        read lineA from file 1
        continue
    // at this point, you have lineA and lineB with matching keys
    process your data
    read lineB from file 2

メモリには 2 つのレコードしかないことに注意してください。

于 2013-07-15T20:25:43.260 に答える