2017-01-03 2 views
1

ファイルの行数を取得する際にこのノードの機能に問題がありますが、正確な詳細を特定することはできませんでした。ノードファイルの行数

function countFileLines(filePath){ 
    return new Promise((resolve, reject) => { 
    let lineCount = 0; 
    fs.createReadStream(filePath) 
    .on("data", (buffer) => { 
     buffer.forEach((chunk) => { 
     if (chunk === 10) lineCount++; 
     }); 
    }).on("end",() => { 
     resolve(lineCount); 
    }).on("error", reject); 
    }); 
}; 

ノード内のファイルの行数を取得する方法がありますか?比較のため

答えて

1

私は推測することができますが、buffer.forEach関数を呼び出すと、問題になる可能性があり、すべてのバイトについて比較を行っています。 VMがあなたのために改行をご覧いただくことがindexOfの使用を検討してください:

function countFileLines(filePath){ 
    return new Promise((resolve, reject) => { 
    let lineCount = 0; 
    fs.createReadStream(filePath) 
     .on("data", (buffer) => { 
     let idx = -1; 
     lineCount--; // Because the loop will run once for idx=-1 
     do { 
      idx = buffer.indexOf(10, idx+1); 
      lineCount++; 
     } while (idx !== -1); 
     }).on("end",() => { 
     resolve(lineCount); 
     }).on("error", reject); 
    }); 
}; 

何この解決策はありませんが、それは.indexOfを使用して、最初の改行の位置を見つけることです。 lineCountをインクリメントし、次の位置を見つけます。 .indexOfの2番目のパラメータは、改行の検索を開始する場所を示します。このようにして、バッファの大きな部分を飛び越えています。 whileループは改行ごとに1回プラス1回実行されます。

Nodeランタイムは、下位レベルで実装されているものを検索し、高速化する必要があります。

私のシステムでは、これは大きなファイル(111 MB)のバッファー長を超えてforループを実行した場合の約2倍の速さです。

+0

通常のforループを使用するよりも効率的に動作しますか? –

+0

はい。私はこの機能を3回、同じファイルで同じマシン上でQiaosenの答えを3回実行しようとしました。私の機能のための最も速い時間は443ミリ秒でした。その中で最も速いのは812msでした。 –

+0

くそー、私は2つの大きなディレクトリと両方の答えを比較しました。どちらのバージョンも大幅に強化されていますが、あなたの方が速いです。 ロジックは直感的ではありませんが、鮮やかです。ありがとう! –

3
function countFileLines(filePath){ 
    return new Promise((resolve, reject) => { 
    let lineCount = 0; 
    let i = 0; 
    fs.createReadStream(filePath) 
    .on("data", (buffer) => { 
     for (i = 0; i < buffer.length; ++i) { 
     if (buffer[i] == 10) lineCount++; 
     } 
    }).on("end",() => { 
     resolve(lineCount); 
    }).on("error", reject); 
    }); 
}; 

元:node index.js 2.38s user 0.29s system 98% cpu 2.713 total

modifed:node index2.js 0.18s user 0.04s system 96% cpu 0.225 total

関連する問題