回答
解決方案沒有我們荷蘭國際集團WC:
var i;
var count = 0;
require('fs').createReadStream(process.argv[2])
.on('data', function(chunk) {
for (i=0; i < chunk.length; ++i)
if (chunk[i] == 10) count++;
})
.on('end', function() {
console.log(count);
});
它的速度較慢,但沒有那麼多,你可能期望 - 爲0.6S + 140M文件,包括Node.js的裝載&啓動時間
>time node countlines.js video.mp4
619643
real 0m0.614s
user 0m0.489s
sys 0m0.132s
>time wc -l video.mp4
619643 video.mp4
real 0m0.133s
user 0m0.108s
sys 0m0.024s
>wc -c video.mp4
144681406 video.mp4
你的基準測試並不是很有說服力,因爲你在一個文件上運行它,而這個文件不是*結構化成行,因此它不代表OP要處理的文件。 'if(chunk [i] == 10)count ++;'行在分析文本文件的過程中會比在分析二進制視頻文件的過程中更頻繁地執行。 – ebohlman
我沒有100MB的文本文件:)我不想到竟然在類似100MB的文本文件的情況下,但10倍數量的換行有什麼區別 - 這是相同的線性搜索迭代中的每個緩衝塊 –
我複製的每個字節輸入腳本本身並將其連接到單個文本文件,即1468750000個字符,62500000行。 WC時間:0m1.375s,node.js時間:0m6.254s。相同的4.5倍差異(這可能會更好,但仍然足夠JS和C程序) –
因爲iojs 1.5.0有Buffer#indexOf()
方法,用它來比較Andrey Sidorov的回答:
[email protected]:~$ wc logs
7342500 27548750 427155000 logs
[email protected]:~$ time wc -l logs
7342500 logs
real 0m0.180s
user 0m0.088s
sys 0m0.084s
[email protected]:~$ nvm use node
Now using node v0.12.1
[email protected]:~$ time node countlines.js logs
7342500
real 0m2.559s
user 0m2.200s
sys 0m0.340s
[email protected]:~$ nvm use iojs
Now using node iojs-v1.6.2
[email protected]:~$ time iojs countlines2.js logs
7342500
real 0m1.363s
user 0m0.920s
sys 0m0.424s
[email protected]:~$ cat countlines.js
var i;
var count = 0;
require('fs').createReadStream(process.argv[2])
.on('data', function(chunk) {
for (i=0; i < chunk.length; ++i)
if (chunk[i] == 10) count++;
})
.on('end', function() {
console.log(count);
});
[email protected]:~$ cat countlines2.js
var i;
var count = 0;
require('fs').createReadStream(process.argv[2])
.on('data', function(chunk) {
var index = -1;
while((index = chunk.indexOf(10, index + 1)) > -1) count++
})
.on('end', function() {
console.log(count);
});
[email protected]:~$
這是另一種沒有太多嵌套的方法。
var fs = require('fs');
filePath = process.argv[2];
fileBuffer = fs.readFileSync(filePath);
to_string = fileBuffer.toString();
split_lines = to_string.split("\n");
console.log(split_lines.length-1);
爲10GB的文件,這不是很高性能,至少可以說。 –
您還可以使用的indexOf():
var index = -1;
var count = 0;
while ((index = chunk.indexOf(10, index + 1)) > -1) count++;
var fs=require('fs');
filename=process.argv[2];
var data=fs.readFileSync(filename);
var res=data.toString().split('\n').length;
console.log(res-1);`
雖然這個代碼片斷可以解決的問題,[包括說明](https://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)確實有助於提高您的文章質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。也請儘量不要用解釋性註釋來擠佔代碼,這會降低代碼和解釋的可讀性! –
該解決方案需要將文件加載到內存中。我會建議反對它。使用'wc'的答案並不是因爲'wc'被優化來傳輸文件。 –
答案還沒有添加任何東西比較有價值的[艾倫Viars(https://stackoverflow.com/a/32286822/238978)誰在一年前發佈了同樣的事情。 –
有一個叫count-lines-in-file的NPM模塊。我一直在使用它爲小(< 1000行)文件,它迄今爲止工作很好。
我們可以使用indexOf讓VM找換行:
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
的第二個參數告訴從哪裏開始尋找換行符。這樣我們就跳過了大塊的緩衝區。 while循環將爲每個換行運行一次,再加一個。
我們讓Node運行時爲我們搜索在較低級別上實現的應該更快。
在我的系統上,這大約是在大文件(111 MB)上的緩衝區長度上運行for
循環的兩倍。
這是與其他人展示的最佳解決方案! – loretoparisi
- 1. 計算文本文件中的行數
- 2. 計算文件中的行數
- 3. 計算文件中的行數 - Scala
- 4. 計算文件中的行數 - C
- 5. 計算文件中的行數
- 6. node.js可以並行計算
- 7. 計算文本文件中的行VB
- 8. 計算文本文件中的行數,字數和字符數
- 9. 用Java計算文件的行數
- 10. 計算行的文件數量-l
- 11. 如何計算文件組的行數?
- 12. 使用CMD計算文件中無頭文件的行數
- 13. 計算txt文件中的行數java文件io
- 14. 在文本文件中計算新行
- 15. 如何計算文件中的行值?
- 16. 計算文件中的換行符
- 17. 如何執行密集的node.js計算
- 18. 從文件輸入計算行數?
- 19. VB.NET計算文本框中的行數
- 20. 計算文本文件中的行數(java)
- 21. 使用OSB計算文本/ csv文件中的行數
- 22. 如何計算文本文件中的空行數?
- 23. 計算文本文件中的列數後刪除行
- 24. 如何計算Octave文本文件中的行數?
- 25. 如何計算C++中每行文本文件的字數?
- 26. 用於計算文件中行數的C函數
- 27. 計算PDB文件中的原子數
- 28. 協助計算文件中的數字
- 29. 計算excel文件的中位數
- 30. 計算文件中的指定字數
'wc -l file' ... – zerkms
「使用NodeJS」 - 背後的任何真正的技術原因? – zerkms
我相信'wc'會比任何「native」nodejs解決方案更快 – zerkms