2014-09-10 3 views
5

내가 100K + 또는 500k + 파일을 포함하는 디렉토리가 있다고 가정하십시오. fs.readdir으로 디렉토리를 읽고 싶지만 스트림이 아닌 비동기입니다. 누군가는 비동기 전에 전체 파일 목록을 읽은 메모리를 사용한다고 말합니다.node.js에서 디렉토리를 스트리밍하는 방법은 무엇입니까?

그래서 해결책은 무엇입니까? 나는 스트림 접근 방식으로 readdir을 원한다. 그럴 수있어?

+1

사람들이 그 주장을 한 것을 믿기 전에 : 시도 했습니까? 또한 : 100k 또는 500k 파일을 가진 dir이 미친 경우, 그런 방식으로 데이터를 정리해서는 안됩니다. 많은 파일들도'rm '할 수 없습니다. –

+0

@ Mike'Pomax'Kamermans, 첫 번째 대답보기 : "방금 700K 파일로 테스트를했는데 파일 이름 목록을로드하는 데 21MB의 메모리 만 필요합니다." 디렉토리에 1M 또는 1,000 만 개의 파일이 있으면 어떻게됩니까? – raitucarp

+1

파일 시스템이 데이터베이스가 아닙니다. dir에있는 백만 개의 파일은 미친 짓이며 코드 솔루션을 찾는 대신 좋은 방법으로 먼저 데이터를 정리하는 것이 필요합니다. –

답변

7

현대 컴퓨터에서 500K 파일이있는 디렉토리를 탐색하는 것은 아무 것도 아닙니다. fs.readdir이 Node.js에서 비동기 적으로 수행되는 경우 지정된 디렉토리의 파일 이름 목록을 읽는 것입니다. 파일 내용을 읽지 않습니다. 나는 방금 Dir에서 700K 파일로 테스트했습니다. 이 파일 이름 목록을로드하는 데는 단지 21MB의 메모리 만 필요합니다.

일단이 파일 이름 목록을로드하면 동시성에 대한 제한을 설정하여 파일 이름을 하나씩 또는 병렬로 탐색하면 쉽게 모두 사용할 수 있습니다. 예 :

var async = require('async'), 
    fs = require('fs'), 
    path = require('path'), 
    parentDir = '/home/user'; 

async.waterfall([ 
    function (cb) { 
     fs.readdir(parentDir, cb); 
    }, 
    function (files, cb) { 
     // `files` is just an array of file names, not full path. 

     // Consume 10 files in parallel. 
     async.eachLimit(files, 10, function (filename, done) { 
      var filePath = path.join(parentDir, filename); 

      // Do with this files whatever you want. 
      // Then don't forget to call `done()`. 
      done(); 
     }, cb); 
    } 
], function (err) { 
    err && console.trace(err); 

    console.log('Done'); 
}); 
+0

예, 사실, 파일의 내용을 읽지 않고 dir에 파일 이름을 나열하고 싶습니다. >이 파일 이름 목록을로드하는 데는 단지 21MB의 메모리가 필요합니다. 그게 문제입니다, 나는 스트림 접근 방식을 사용하고 싶습니다. – raitucarp

+2

수백만 개의 파일을 저장하고 싶다면 디렉토리 구조를 바꾸는 것이 좋습니다. 또는 어떤 종류의 데이터베이스를 사용하십시오. 그래도 원래 아이디어를 고수하고 싶다면 https://github.com/oleics/node-filewalker를 살펴 보시기 바랍니다. 그것은 당신이 찾고있는 것을 제공 할 수 있습니다. 후드에서 동일한 로직을 수행합니다. 즉, 어쨌든 전체 디렉토리의 파일 목록을 메모리로 읽습니다. 하드 드라이브에 수동으로 액세스하고 블록 단위로 디렉토리 목록을 읽지 않는 한 Node.js에서 인식하고있는 다른 방법은 없습니다. – Eye

+0

@ 아이 어떻게 node-filewalker가 문제를 해결할 수 있습니까? –

관련 문제