2017-05-27 80 views
0

我有一個由空文件組成的目錄,我想遍歷它們的每個名稱。但是,我有將近2000萬個這樣的空文件,並將它們全部加載到內存中,並且使用fs.readdirfs.readdirSync都會花費不必要的時間,吞噬系統中的所有內存。NodeJS通過文件讀取巨大的目錄文件

這將是什麼方法呢?

理想我想尋找的東西,以異步方式由文件中讀取文件的代碼,將ressemble如下:

readdirfilebyfile((filename)=>{....}),這樣在任何時候,我會保留文件的完整列表在內存中。

我正在使用的當前解決方案是將所有文件名轉儲到單個文件中,然後我將其作爲數據流讀取。但是,這只是逃避了一個問題,我應該知道如何解決而不訴諸於此。

+0

重複? https://stackoverflow.com/questions/25757293/how-to-stream-read-directory-in-node-js還有https://groups.google.com/forum/#!topic/nodejs/t0ziBVsPRqw那裏至少在第二環節是一些間接的解決方案。我認爲純粹在node.js中沒有直接的解決方案。但是,在鏈接的SO線程中的答案表明這沒有問題(他嘗試過),你只需確保不一次開始處理它們,只要閱讀那個大列表似乎沒問題。好的 - 如果我使用他的計算作爲你的場景的基礎,600 MB的內存.... –

+0

@Mörre我剛剛提出了這個問題,因爲OP沒有得到一個功能的答案。答案仍然想要將所有文件名讀入內存。我希望通過訪問一個'n'文件而不需要讀取之前或之後的文件。 –

+0

你想完成什麼?你想對這些文件名執行什麼操作? – robertklep

回答

1

這個呢? pv是管道查看器,用於bash管道的速率限制器。

const spawn = require('child_process').spawn; 
const exec = require('child_process').exec; 
const tail = spawn('tail -f /tpm/filelist | pv -l -L 10 -q'); 
tail.stdout.on('data', fileName => { 
    // parse filenames here 
    console.log(fileName); 
}); 
exec('ls > /tpm/filelist');